In [1]:
import numpy as np
import pandas as pd
import h5py
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.express as px
from pandas.core.dtypes.common import is_numeric_dtype
from scipy.stats import zscore
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import backend, layers, losses, optimizers
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Input, Dropout,BatchNormalization
from tensorflow.keras.utils import to_categorical
from keras_tuner.tuners import RandomSearch

import warnings
warnings.filterwarnings("ignore")
random_state=42
%matplotlib inline
#¶

PART-A¶

#¶

1. Data import and Understanding¶

A. Read the ‘Signals.csv’ as DataFrame and import required libraries.¶

In [2]:
# signals=pd.read_csv('/content/drive/MyDrive/GL/Signal.csv')
signals=pd.read_csv("Signals.csv")
signals_original=signals.copy(deep=True)
signals.head()
Out[2]:
Parameter 1 Parameter 2 Parameter 3 Parameter 4 Parameter 5 Parameter 6 Parameter 7 Parameter 8 Parameter 9 Parameter 10 Parameter 11 Signal_Strength
0 7.4 0.70 0.00 1.9 0.076 11.0 34.0 0.9978 3.51 0.56 9.4 5
1 7.8 0.88 0.00 2.6 0.098 25.0 67.0 0.9968 3.20 0.68 9.8 5
2 7.8 0.76 0.04 2.3 0.092 15.0 54.0 0.9970 3.26 0.65 9.8 5
3 11.2 0.28 0.56 1.9 0.075 17.0 60.0 0.9980 3.16 0.58 9.8 6
4 7.4 0.70 0.00 1.9 0.076 11.0 34.0 0.9978 3.51 0.56 9.4 5
In [3]:
signals.shape
Out[3]:
(1599, 12)

Signals dataset contains 1599 entries with 12 features.

B. Check for missing values and print percentage for each attribute.¶

In [4]:
# To check the missing data percentage
signals.isnull().mean()*100
Out[4]:
Parameter 1        0.0
Parameter 2        0.0
Parameter 3        0.0
Parameter 4        0.0
Parameter 5        0.0
Parameter 6        0.0
Parameter 7        0.0
Parameter 8        0.0
Parameter 9        0.0
Parameter 10       0.0
Parameter 11       0.0
Signal_Strength    0.0
dtype: float64
In [5]:
(signals.isnull().sum()/signals.shape[0])*100
Out[5]:
Parameter 1        0.0
Parameter 2        0.0
Parameter 3        0.0
Parameter 4        0.0
Parameter 5        0.0
Parameter 6        0.0
Parameter 7        0.0
Parameter 8        0.0
Parameter 9        0.0
Parameter 10       0.0
Parameter 11       0.0
Signal_Strength    0.0
dtype: float64
In [6]:
signals.isnull().sum()
Out[6]:
Parameter 1        0
Parameter 2        0
Parameter 3        0
Parameter 4        0
Parameter 5        0
Parameter 6        0
Parameter 7        0
Parameter 8        0
Parameter 9        0
Parameter 10       0
Parameter 11       0
Signal_Strength    0
dtype: int64

No missing data found, that’s why 0%.

C. Check for presence of duplicate records in the dataset and impute with appropriate method.¶

In [7]:
signals[signals.duplicated()]
Out[7]:
Parameter 1 Parameter 2 Parameter 3 Parameter 4 Parameter 5 Parameter 6 Parameter 7 Parameter 8 Parameter 9 Parameter 10 Parameter 11 Signal_Strength
4 7.4 0.700 0.00 1.90 0.076 11.0 34.0 0.99780 3.51 0.56 9.4 5
11 7.5 0.500 0.36 6.10 0.071 17.0 102.0 0.99780 3.35 0.80 10.5 5
27 7.9 0.430 0.21 1.60 0.106 10.0 37.0 0.99660 3.17 0.91 9.5 5
40 7.3 0.450 0.36 5.90 0.074 12.0 87.0 0.99780 3.33 0.83 10.5 5
65 7.2 0.725 0.05 4.65 0.086 4.0 11.0 0.99620 3.41 0.39 10.9 5
... ... ... ... ... ... ... ... ... ... ... ... ...
1563 7.2 0.695 0.13 2.00 0.076 12.0 20.0 0.99546 3.29 0.54 10.1 5
1564 7.2 0.695 0.13 2.00 0.076 12.0 20.0 0.99546 3.29 0.54 10.1 5
1567 7.2 0.695 0.13 2.00 0.076 12.0 20.0 0.99546 3.29 0.54 10.1 5
1581 6.2 0.560 0.09 1.70 0.053 24.0 32.0 0.99402 3.54 0.60 11.3 5
1596 6.3 0.510 0.13 2.30 0.076 29.0 40.0 0.99574 3.42 0.75 11.0 6

240 rows × 12 columns

In [8]:
signals.drop_duplicates(inplace=True)
signals.reset_index(inplace=True, drop=True)
In [9]:
signals[signals.duplicated()]
Out[9]:
Parameter 1 Parameter 2 Parameter 3 Parameter 4 Parameter 5 Parameter 6 Parameter 7 Parameter 8 Parameter 9 Parameter 10 Parameter 11 Signal_Strength

Duplicate records have been removed and dataset can be used for further analysis.

D. Visualise distribution of the target variable.¶

In [10]:
signals.Signal_Strength.value_counts()
Out[10]:
5    577
6    535
7    167
4     53
8     17
3     10
Name: Signal_Strength, dtype: int64
In [11]:
px.pie(data_frame=signals, values=signals.Signal_Strength.value_counts(), names=signals.Signal_Strength.value_counts().keys(), title='Signal Quality distribution')
In [12]:
px.bar(data_frame=signals.groupby(by=['Signal_Strength']).size().reset_index(name="counts"),x='Signal_Strength',y='counts', barmode="group")

As per the above graphical representation:

  • Signal strength is divided into 6 units i.e.(class-3, class-4, class-5, class-6, class-7, class-8) having total of 7642 records.
  • Distribution is as follows:
    • class-3 have 10 records.
    • class-4 have 53 records.
    • class-5 have 577 records.
    • class-6 have 535 records.
    • class-7 have 167 records.
    • class-8 have 17 records.
  • class-5 has the highest distribution count.

E. Share insights from the initial data analysis (at least 2).¶

In [13]:
signals.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1359 entries, 0 to 1358
Data columns (total 12 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   Parameter 1      1359 non-null   float64
 1   Parameter 2      1359 non-null   float64
 2   Parameter 3      1359 non-null   float64
 3   Parameter 4      1359 non-null   float64
 4   Parameter 5      1359 non-null   float64
 5   Parameter 6      1359 non-null   float64
 6   Parameter 7      1359 non-null   float64
 7   Parameter 8      1359 non-null   float64
 8   Parameter 9      1359 non-null   float64
 9   Parameter 10     1359 non-null   float64
 10  Parameter 11     1359 non-null   float64
 11  Signal_Strength  1359 non-null   int64  
dtypes: float64(11), int64(1)
memory usage: 127.5 KB
  • Signals dataset have 1359 entries.
  • 11 features named as Parameters as dtype(float64) and 1 target value as Signal_Strength as dtype(int64).
In [14]:
signals.describe().T
Out[14]:
count mean std min 25% 50% 75% max
Parameter 1 1359.0 8.310596 1.736990 4.60000 7.1000 7.9000 9.20000 15.90000
Parameter 2 1359.0 0.529478 0.183031 0.12000 0.3900 0.5200 0.64000 1.58000
Parameter 3 1359.0 0.272333 0.195537 0.00000 0.0900 0.2600 0.43000 1.00000
Parameter 4 1359.0 2.523400 1.352314 0.90000 1.9000 2.2000 2.60000 15.50000
Parameter 5 1359.0 0.088124 0.049377 0.01200 0.0700 0.0790 0.09100 0.61100
Parameter 6 1359.0 15.893304 10.447270 1.00000 7.0000 14.0000 21.00000 72.00000
Parameter 7 1359.0 46.825975 33.408946 6.00000 22.0000 38.0000 63.00000 289.00000
Parameter 8 1359.0 0.996709 0.001869 0.99007 0.9956 0.9967 0.99782 1.00369
Parameter 9 1359.0 3.309787 0.155036 2.74000 3.2100 3.3100 3.40000 4.01000
Parameter 10 1359.0 0.658705 0.170667 0.33000 0.5500 0.6200 0.73000 2.00000
Parameter 11 1359.0 10.432315 1.082065 8.40000 9.5000 10.2000 11.10000 14.90000
Signal_Strength 1359.0 5.623252 0.823578 3.00000 5.0000 6.0000 6.00000 8.00000
  • From Descriptive statistics, its concluded that data is mainly positively skewed.
  • Most of the parameters have outliers.
In [15]:
numerical_col=[i for i in signals.columns.drop('Signal_Strength') if is_numeric_dtype(signals[i])]
fig=plt.figure(figsize=(20,10))
for i in range(0,len(numerical_col)):
   ax=fig.add_subplot(6,2,i+1)
   sns.boxplot(data=signals, x=numerical_col[i])
   ax.set_title(numerical_col[i],color='orange',weight='bold',fontsize=16)
plt.tight_layout()
plt.show()

Many outliers are present, will be replacing these outliers.

In [16]:
signals_w_outliers=signals.copy(deep=True)

#Treating outliers.
for col_name in signals.columns.drop('Signal_Strength'):
    if is_numeric_dtype(signals[col_name]):
        q1=np.quantile(signals[col_name], 0.25)
        q3=np.quantile(signals[col_name], 0.75)
        cut_off=1.5*(q3-q1)
        right_whisker= q3 + cut_off
        left_whiskers=q1 - cut_off

        #Replace every outlier on the upper side by the upper whisker
        for i in np.where(signals[col_name] > right_whisker)[0]:
            signals.loc[i,col_name] = right_whisker

        #Replace every outlier on the lower side by the lower whisker
        for i in np.where(signals[col_name] < left_whiskers)[0]:
            signals.loc[i,col_name] = left_whiskers

numerical_col=[i for i in signals.columns.drop('Signal_Strength') if is_numeric_dtype(signals[i])]
fig=plt.figure(figsize=(20,10))
for i in range(0,len(numerical_col)):
   ax=fig.add_subplot(6,2,i+1)
   sns.boxplot(data=signals, x=numerical_col[i])
   ax.set_title(numerical_col[i],color='orange',weight='bold',fontsize=16)
plt.tight_layout()
plt.show()
In [17]:
plt.figure(figsize=(15,7))
sns.heatmap(signals.corr(), annot=True,center=True, linewidths=1)
plt.show()
  • Some features are correlated as positive and negative correlation.
  • Correlation value ranges in between 0.7 and -0.7.

2. Data preprocessing¶

A. Split the data into X & Y.¶

In [18]:
X=signals.drop('Signal_Strength',axis=1)
y=signals['Signal_Strength']
X.shape,y.shape
Out[18]:
((1359, 11), (1359,))

Signal dataset is split into feature and target variables for further modelling.

B. Split the data into train & test with 70:30 proportion.¶

C. Print shape of all the 4 variables and verify if train and test data is in sync.¶

In [19]:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.30, random_state=random_state, stratify=y)
In [20]:
print('Feature training dataset have %d records and %d feature'%(X_train.shape[0], X_train.shape[1]))
print('Feature testing dataset have %d records and %d feature'%(X_test.shape[0], X_test.shape[1]))
print('Target training dataset have %d records'%(y_train.shape[0]))
print('Target testing dataset have %d records'%(y_test.shape[0]))
Feature training dataset have 951 records and 11 feature
Feature testing dataset have 408 records and 11 feature
Target training dataset have 951 records
Target testing dataset have 408 records

D. Normalise the train and test data with appropriate method.¶

Applying zscore which is $$ \frac{X-X_{mean}}{X_{std}} $$

In [21]:
X_train=X_train.apply(zscore)
X_train.head()
Out[21]:
Parameter 1 Parameter 2 Parameter 3 Parameter 4 Parameter 5 Parameter 6 Parameter 7 Parameter 8 Parameter 9 Parameter 10 Parameter 11
732 -1.109910 0.555085 -0.337200 -1.178133 -0.062214 -0.375435 -0.465921 0.102155 1.779210 0.075439 -0.579891
672 -0.819939 0.582698 -0.541713 0.124947 2.198027 -0.973407 -0.905697 -0.323253 0.608998 -0.431829 -0.117863
376 -0.297991 0.113270 0.378597 -0.200823 -0.381306 0.521523 0.602108 0.376786 -0.366178 -0.649229 -1.134324
71 -0.877933 1.411101 -1.410895 0.124947 1.214157 -0.176111 -0.528746 -0.054008 1.389139 -0.721696 0.251759
287 1.093872 -0.936040 1.861319 0.939372 2.171436 -0.574759 -0.183207 0.699880 -0.496202 0.075439 1.915058
In [22]:
X_test=X_test.apply(zscore)
X_test.head()
Out[22]:
Parameter 1 Parameter 2 Parameter 3 Parameter 4 Parameter 5 Parameter 6 Parameter 7 Parameter 8 Parameter 9 Parameter 10 Parameter 11
1185 -0.614449 0.393462 -0.019291 -0.550950 -0.095020 0.149752 2.099022 -0.534685 -0.248584 -0.963137 -0.510120
699 -0.412926 -0.262259 0.237928 0.801156 -0.660156 -1.232816 -1.033787 0.126674 -0.676376 -0.742290 -0.126207
1001 0.997739 -0.619925 1.009586 -0.381937 -0.434102 -1.126464 -0.998587 -0.140296 -0.319883 0.656405 1.793361
281 1.400786 0.393462 0.803810 0.801156 0.470115 2.064077 1.007819 1.382650 -0.248584 0.361943 -0.894034
1306 -1.353369 0.691517 -0.893837 0.294116 -0.038507 -0.062951 -0.646586 -0.813790 1.819077 -0.153366 1.505426

E. Transform Labels into format acceptable by Neural Network.¶

Target label ranges from 3 to 8, so total number of classes will be as 'max(y)+1` which is 9.

In [23]:
y_cat_train=tf.keras.utils.to_categorical(y_train,num_classes=9)
y_cat_test=tf.keras.utils.to_categorical(y_test,num_classes=9)
In [24]:
print('Target training dataset have %d records and %d feature'%(y_cat_train.shape[0],y_cat_train.shape[1]))
print('Target testing dataset have %d records and %d feature'%(y_cat_test.shape[0],y_cat_test.shape[1]))
Target training dataset have 951 records and 9 feature
Target testing dataset have 408 records and 9 feature

3. Model Training & Evaluation using Neural Network.¶

A. Design a Neural Network to train a classifier.¶

B. Train the classifier using previously designed Architecture.¶

C. Plot 2 separate visuals.¶

  • Training Loss and Validation Loss
  • Training Accuracy and Validation Accuracy
In [25]:
backend.clear_session()
tf.random.set_seed(random_state)

#Initialize sequenial model
model = Sequential()
model.add(Dense(input_dim=11, units=64,activation='relu'))
model.add(Dense(16,activation='relu'))
model.add(Dense(8,activation='relu'))

# Add dense layer which provides 8 outputs after applying softmax
model.add(Dense(9, activation='softmax'))
In [26]:
#compile the model
optimizer = tf.keras.optimizers.SGD(0.01)
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])
In [27]:
model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 64)                768       
                                                                 
 dense_1 (Dense)             (None, 16)                1040      
                                                                 
 dense_2 (Dense)             (None, 8)                 136       
                                                                 
 dense_3 (Dense)             (None, 9)                 81        
                                                                 
=================================================================
Total params: 2,025
Trainable params: 2,025
Non-trainable params: 0
_________________________________________________________________
In [28]:
# Fit the model
history=model.fit(x=X_train, y=y_cat_train, batch_size=20, epochs=100, validation_split=0.2, verbose=1)
Epoch 1/100
38/38 [==============================] - 1s 9ms/step - loss: 1.9977 - accuracy: 0.3908 - val_loss: 1.9110 - val_accuracy: 0.3927
Epoch 2/100
38/38 [==============================] - 0s 3ms/step - loss: 1.7836 - accuracy: 0.4329 - val_loss: 1.7170 - val_accuracy: 0.3874
Epoch 3/100
38/38 [==============================] - 0s 3ms/step - loss: 1.6111 - accuracy: 0.4342 - val_loss: 1.5688 - val_accuracy: 0.3874
Epoch 4/100
38/38 [==============================] - 0s 3ms/step - loss: 1.4822 - accuracy: 0.4342 - val_loss: 1.4543 - val_accuracy: 0.3874
Epoch 5/100
38/38 [==============================] - 0s 3ms/step - loss: 1.3856 - accuracy: 0.4421 - val_loss: 1.3670 - val_accuracy: 0.4241
Epoch 6/100
38/38 [==============================] - 0s 3ms/step - loss: 1.3145 - accuracy: 0.4750 - val_loss: 1.3019 - val_accuracy: 0.4764
Epoch 7/100
38/38 [==============================] - 0s 3ms/step - loss: 1.2634 - accuracy: 0.5105 - val_loss: 1.2546 - val_accuracy: 0.5131
Epoch 8/100
38/38 [==============================] - 0s 3ms/step - loss: 1.2244 - accuracy: 0.5237 - val_loss: 1.2167 - val_accuracy: 0.5393
Epoch 9/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1923 - accuracy: 0.5355 - val_loss: 1.1864 - val_accuracy: 0.5497
Epoch 10/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1661 - accuracy: 0.5408 - val_loss: 1.1598 - val_accuracy: 0.5550
Epoch 11/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1425 - accuracy: 0.5632 - val_loss: 1.1379 - val_accuracy: 0.5654
Epoch 12/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1218 - accuracy: 0.5711 - val_loss: 1.1171 - val_accuracy: 0.5759
Epoch 13/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1033 - accuracy: 0.5724 - val_loss: 1.0999 - val_accuracy: 0.5707
Epoch 14/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0869 - accuracy: 0.5816 - val_loss: 1.0839 - val_accuracy: 0.5864
Epoch 15/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0741 - accuracy: 0.5776 - val_loss: 1.0691 - val_accuracy: 0.5864
Epoch 16/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0630 - accuracy: 0.5829 - val_loss: 1.0544 - val_accuracy: 0.6126
Epoch 17/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0539 - accuracy: 0.5763 - val_loss: 1.0435 - val_accuracy: 0.6073
Epoch 18/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0442 - accuracy: 0.5803 - val_loss: 1.0365 - val_accuracy: 0.6178
Epoch 19/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0372 - accuracy: 0.5868 - val_loss: 1.0255 - val_accuracy: 0.6126
Epoch 20/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0297 - accuracy: 0.5803 - val_loss: 1.0185 - val_accuracy: 0.6126
Epoch 21/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0234 - accuracy: 0.5842 - val_loss: 1.0125 - val_accuracy: 0.6126
Epoch 22/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0181 - accuracy: 0.5868 - val_loss: 1.0045 - val_accuracy: 0.6073
Epoch 23/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0126 - accuracy: 0.5789 - val_loss: 1.0004 - val_accuracy: 0.6021
Epoch 24/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0070 - accuracy: 0.5816 - val_loss: 0.9904 - val_accuracy: 0.6021
Epoch 25/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0030 - accuracy: 0.5829 - val_loss: 0.9846 - val_accuracy: 0.6178
Epoch 26/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9992 - accuracy: 0.5895 - val_loss: 0.9809 - val_accuracy: 0.6021
Epoch 27/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9946 - accuracy: 0.5803 - val_loss: 0.9759 - val_accuracy: 0.6126
Epoch 28/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9906 - accuracy: 0.5921 - val_loss: 0.9763 - val_accuracy: 0.6126
Epoch 29/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9875 - accuracy: 0.5921 - val_loss: 0.9719 - val_accuracy: 0.6073
Epoch 30/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9843 - accuracy: 0.5921 - val_loss: 0.9656 - val_accuracy: 0.6021
Epoch 31/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9807 - accuracy: 0.5908 - val_loss: 0.9642 - val_accuracy: 0.6021
Epoch 32/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9783 - accuracy: 0.5921 - val_loss: 0.9606 - val_accuracy: 0.6126
Epoch 33/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9749 - accuracy: 0.6000 - val_loss: 0.9584 - val_accuracy: 0.6073
Epoch 34/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9718 - accuracy: 0.5908 - val_loss: 0.9537 - val_accuracy: 0.6178
Epoch 35/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9690 - accuracy: 0.5895 - val_loss: 0.9502 - val_accuracy: 0.6178
Epoch 36/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9675 - accuracy: 0.6079 - val_loss: 0.9484 - val_accuracy: 0.6178
Epoch 37/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9646 - accuracy: 0.6013 - val_loss: 0.9463 - val_accuracy: 0.6178
Epoch 38/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9613 - accuracy: 0.6039 - val_loss: 0.9492 - val_accuracy: 0.6126
Epoch 39/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9589 - accuracy: 0.6013 - val_loss: 0.9422 - val_accuracy: 0.6126
Epoch 40/100
38/38 [==============================] - 0s 2ms/step - loss: 0.9568 - accuracy: 0.6039 - val_loss: 0.9418 - val_accuracy: 0.5969
Epoch 41/100
38/38 [==============================] - 0s 2ms/step - loss: 0.9543 - accuracy: 0.6000 - val_loss: 0.9369 - val_accuracy: 0.6178
Epoch 42/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9515 - accuracy: 0.6079 - val_loss: 0.9369 - val_accuracy: 0.6126
Epoch 43/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9505 - accuracy: 0.6039 - val_loss: 0.9328 - val_accuracy: 0.6178
Epoch 44/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9483 - accuracy: 0.6000 - val_loss: 0.9337 - val_accuracy: 0.6073
Epoch 45/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9435 - accuracy: 0.6145 - val_loss: 0.9326 - val_accuracy: 0.6230
Epoch 46/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9438 - accuracy: 0.6066 - val_loss: 0.9269 - val_accuracy: 0.6178
Epoch 47/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9407 - accuracy: 0.6092 - val_loss: 0.9240 - val_accuracy: 0.6073
Epoch 48/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9389 - accuracy: 0.6171 - val_loss: 0.9289 - val_accuracy: 0.6230
Epoch 49/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9369 - accuracy: 0.6145 - val_loss: 0.9225 - val_accuracy: 0.6073
Epoch 50/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9357 - accuracy: 0.6145 - val_loss: 0.9205 - val_accuracy: 0.6021
Epoch 51/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9333 - accuracy: 0.6211 - val_loss: 0.9186 - val_accuracy: 0.6126
Epoch 52/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9322 - accuracy: 0.6171 - val_loss: 0.9190 - val_accuracy: 0.6178
Epoch 53/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9298 - accuracy: 0.6132 - val_loss: 0.9182 - val_accuracy: 0.6073
Epoch 54/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9286 - accuracy: 0.6237 - val_loss: 0.9176 - val_accuracy: 0.6021
Epoch 55/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9266 - accuracy: 0.6171 - val_loss: 0.9143 - val_accuracy: 0.6021
Epoch 56/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9247 - accuracy: 0.6237 - val_loss: 0.9153 - val_accuracy: 0.6178
Epoch 57/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9228 - accuracy: 0.6263 - val_loss: 0.9130 - val_accuracy: 0.6073
Epoch 58/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9208 - accuracy: 0.6289 - val_loss: 0.9164 - val_accuracy: 0.6126
Epoch 59/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9196 - accuracy: 0.6276 - val_loss: 0.9107 - val_accuracy: 0.6126
Epoch 60/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9176 - accuracy: 0.6303 - val_loss: 0.9109 - val_accuracy: 0.6126
Epoch 61/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9158 - accuracy: 0.6289 - val_loss: 0.9083 - val_accuracy: 0.6126
Epoch 62/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9143 - accuracy: 0.6382 - val_loss: 0.9059 - val_accuracy: 0.6126
Epoch 63/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9115 - accuracy: 0.6329 - val_loss: 0.9142 - val_accuracy: 0.6178
Epoch 64/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9116 - accuracy: 0.6237 - val_loss: 0.9060 - val_accuracy: 0.6178
Epoch 65/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9093 - accuracy: 0.6382 - val_loss: 0.9061 - val_accuracy: 0.6178
Epoch 66/100
38/38 [==============================] - 0s 2ms/step - loss: 0.9074 - accuracy: 0.6342 - val_loss: 0.9074 - val_accuracy: 0.6126
Epoch 67/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9066 - accuracy: 0.6276 - val_loss: 0.9039 - val_accuracy: 0.6126
Epoch 68/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9047 - accuracy: 0.6303 - val_loss: 0.9057 - val_accuracy: 0.6178
Epoch 69/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9036 - accuracy: 0.6368 - val_loss: 0.9019 - val_accuracy: 0.6230
Epoch 70/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9007 - accuracy: 0.6447 - val_loss: 0.9045 - val_accuracy: 0.6178
Epoch 71/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8982 - accuracy: 0.6408 - val_loss: 0.9066 - val_accuracy: 0.6126
Epoch 72/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8984 - accuracy: 0.6421 - val_loss: 0.9038 - val_accuracy: 0.6126
Epoch 73/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8966 - accuracy: 0.6355 - val_loss: 0.9009 - val_accuracy: 0.6178
Epoch 74/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8943 - accuracy: 0.6434 - val_loss: 0.9017 - val_accuracy: 0.6230
Epoch 75/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8925 - accuracy: 0.6355 - val_loss: 0.9001 - val_accuracy: 0.6126
Epoch 76/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8910 - accuracy: 0.6421 - val_loss: 0.9033 - val_accuracy: 0.6126
Epoch 77/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8891 - accuracy: 0.6355 - val_loss: 0.8994 - val_accuracy: 0.6178
Epoch 78/100
38/38 [==============================] - 0s 2ms/step - loss: 0.8890 - accuracy: 0.6382 - val_loss: 0.8963 - val_accuracy: 0.6283
Epoch 79/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8861 - accuracy: 0.6382 - val_loss: 0.8950 - val_accuracy: 0.6335
Epoch 80/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8855 - accuracy: 0.6474 - val_loss: 0.8991 - val_accuracy: 0.6178
Epoch 81/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8842 - accuracy: 0.6447 - val_loss: 0.8976 - val_accuracy: 0.6178
Epoch 82/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8811 - accuracy: 0.6461 - val_loss: 0.8940 - val_accuracy: 0.6230
Epoch 83/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8808 - accuracy: 0.6513 - val_loss: 0.8978 - val_accuracy: 0.6126
Epoch 84/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8797 - accuracy: 0.6500 - val_loss: 0.8976 - val_accuracy: 0.6178
Epoch 85/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8775 - accuracy: 0.6553 - val_loss: 0.8922 - val_accuracy: 0.6387
Epoch 86/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8765 - accuracy: 0.6645 - val_loss: 0.8952 - val_accuracy: 0.6230
Epoch 87/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8732 - accuracy: 0.6539 - val_loss: 0.9036 - val_accuracy: 0.6178
Epoch 88/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8752 - accuracy: 0.6539 - val_loss: 0.8969 - val_accuracy: 0.6126
Epoch 89/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8713 - accuracy: 0.6605 - val_loss: 0.8936 - val_accuracy: 0.6230
Epoch 90/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8704 - accuracy: 0.6605 - val_loss: 0.8918 - val_accuracy: 0.6335
Epoch 91/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8687 - accuracy: 0.6632 - val_loss: 0.8900 - val_accuracy: 0.6492
Epoch 92/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8681 - accuracy: 0.6513 - val_loss: 0.8923 - val_accuracy: 0.6230
Epoch 93/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8669 - accuracy: 0.6592 - val_loss: 0.8956 - val_accuracy: 0.6073
Epoch 94/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8623 - accuracy: 0.6711 - val_loss: 0.8934 - val_accuracy: 0.6492
Epoch 95/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8643 - accuracy: 0.6618 - val_loss: 0.8918 - val_accuracy: 0.6335
Epoch 96/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8607 - accuracy: 0.6592 - val_loss: 0.8904 - val_accuracy: 0.6440
Epoch 97/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8615 - accuracy: 0.6618 - val_loss: 0.8920 - val_accuracy: 0.6283
Epoch 98/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8580 - accuracy: 0.6605 - val_loss: 0.8909 - val_accuracy: 0.6335
Epoch 99/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8591 - accuracy: 0.6566 - val_loss: 0.8902 - val_accuracy: 0.6492
Epoch 100/100
38/38 [==============================] - 0s 3ms/step - loss: 0.8562 - accuracy: 0.6632 - val_loss: 0.8899 - val_accuracy: 0.6440
In [29]:
# Capturing learning history per epoch
hist  = pd.DataFrame(history.history)
hist['epoch'] = history.epoch

# Plotting Loss at different epochs
plt.title('Training Loss vs Validation Loss',fontsize=15,color="green")
plt.plot(hist['loss'])
plt.plot(hist['val_loss'])
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()

# Plotting Accuracy at different epochs
plt.title('Training Accuracy vs Validation Accuracy',fontsize=15,color="green")
plt.plot(hist['accuracy'])
plt.plot(hist['val_accuracy'])
plt.ylabel('accuracy')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()
In [30]:
# calculate score of training data
model.evaluate(X_train, y_cat_train, batch_size=20, verbose=1)
48/48 [==============================] - 0s 1ms/step - loss: 0.8581 - accuracy: 0.6519
Out[30]:
[0.8580824136734009, 0.6519452929496765]
In [31]:
# calculate score of testing data
model.evaluate(X_test, y_cat_test, batch_size=20, verbose=1)
21/21 [==============================] - 0s 2ms/step - loss: 0.9738 - accuracy: 0.5809
Out[31]:
[0.9737644791603088, 0.5808823704719543]
In [32]:
# Predicting for X_test
y_pred=model.predict(X_test)
y_pred
13/13 [==============================] - 0s 1ms/step
Out[32]:
array([[1.9374361e-06, 6.9513757e-05, 3.0812291e-05, ..., 1.4998730e-01,
        2.0264250e-03, 8.8195171e-05],
       [3.5061644e-04, 2.0829607e-03, 8.8139251e-04, ..., 4.1179952e-01,
        3.9620627e-02, 4.5146686e-03],
       [2.1333779e-04, 2.7704018e-04, 1.3851421e-04, ..., 3.1349000e-01,
        6.2052524e-01, 4.3284602e-02],
       ...,
       [4.3199203e-04, 1.1876954e-03, 1.8928554e-04, ..., 3.9976192e-01,
        3.1093350e-01, 2.2049813e-02],
       [2.0673810e-06, 7.9938269e-05, 4.5056448e-05, ..., 3.7442851e-01,
        1.2831197e-02, 3.9829564e-04],
       [3.5760399e-06, 9.7782715e-05, 4.6790516e-05, ..., 1.9788137e-01,
        2.6948268e-03, 1.3410010e-04]], dtype=float32)
In [33]:
y_pred_final=[]
for i in y_pred:
  y_pred_final.append(np.argmax(i))
print(y_pred_final)
[5, 5, 7, 5, 6, 5, 5, 6, 5, 6, 5, 6, 5, 5, 5, 6, 5, 5, 6, 6, 5, 7, 5, 6, 6, 5, 5, 7, 5, 6, 6, 5, 5, 5, 5, 6, 7, 5, 5, 7, 5, 6, 5, 7, 6, 5, 6, 6, 6, 6, 5, 6, 6, 6, 6, 5, 6, 5, 5, 5, 7, 6, 6, 5, 7, 5, 6, 5, 6, 6, 6, 5, 5, 6, 6, 5, 6, 5, 6, 6, 5, 6, 6, 5, 5, 7, 6, 5, 6, 6, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 6, 5, 5, 5, 5, 6, 5, 6, 5, 7, 5, 5, 6, 6, 5, 6, 7, 6, 5, 7, 6, 6, 7, 6, 5, 5, 5, 6, 5, 6, 6, 5, 5, 6, 5, 6, 5, 5, 7, 6, 5, 5, 5, 6, 5, 5, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 6, 6, 5, 6, 5, 6, 5, 5, 7, 5, 5, 5, 6, 6, 6, 5, 5, 6, 6, 5, 5, 6, 5, 6, 6, 5, 7, 6, 5, 6, 5, 5, 6, 5, 6, 7, 7, 6, 6, 6, 6, 5, 6, 5, 5, 6, 6, 6, 6, 7, 5, 7, 6, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 5, 5, 7, 6, 5, 7, 5, 5, 5, 7, 5, 5, 6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 6, 5, 5, 7, 5, 6, 6, 6, 6, 5, 6, 5, 5, 7, 6, 5, 6, 5, 6, 6, 6, 5, 5, 6, 5, 5, 7, 6, 5, 5, 5, 7, 6, 5, 5, 7, 5, 5, 6, 6, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 5, 6, 7, 5, 7, 5, 5, 5, 7, 5, 7, 7, 7, 6, 5, 5, 7, 6, 6, 5, 5, 5, 6, 6, 5, 6, 6, 6, 6, 5, 6, 6, 5, 5, 6, 6, 5, 6, 6, 7, 6, 7, 6, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 7, 5, 6, 6, 5, 5, 5, 6, 6, 7, 5, 6, 6, 6, 5, 5, 5, 5, 6, 6, 5, 5, 7, 5, 7, 5, 6, 5, 6, 6, 6, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 6, 5, 5]
In [34]:
print('Classification Report')
print(classification_report(y_test,y_pred_final))
Classification Report
              precision    recall  f1-score   support

           3       0.00      0.00      0.00         3
           4       0.00      0.00      0.00        16
           5       0.64      0.72      0.68       173
           6       0.54      0.58      0.56       161
           7       0.47      0.40      0.43        50
           8       0.00      0.00      0.00         5

    accuracy                           0.58       408
   macro avg       0.27      0.28      0.28       408
weighted avg       0.54      0.58      0.56       408

In [35]:
cm=confusion_matrix(y_test.tolist(),y_pred_final)

plt.figure(figsize=(10,7))
sns.heatmap(cm,annot=True,fmt='d', cmap='Blues', xticklabels=[3,4,5,6,7,8], yticklabels=[3,4,5,6,7,8])
plt.xlabel('Predicted')
plt.ylabel('Truth')
plt.show()

D. Design new architecture/update existing architecture in attempt to improve the performance of the model.¶

E. Plot visuals as in Q3.C and share insights about difference observed in both the models.¶

Tuning params using Keras Tuner.

In [36]:
backend.clear_session()
tf.random.set_seed(random_state)

def build_model(h):
    model_keras = keras.Sequential()
    for i in range(h.Int('num_layers', 2, 5)):
        model_keras.add(layers.Dense(units=h.Int('units_' + str(i),
                                            min_value=32,
                                            max_value=256,
                                            step=10),
                               activation=h.Choice('act_' + str(i), ['relu', 'sigmoid'])))
    model_keras.add(layers.Dense(9, activation='softmax'))
    model_keras.compile(
        optimizer=keras.optimizers.SGD(
            h.Choice('learning_rate', [1e-2, 1e-3, 1e-4, 1e-5])),
        loss='categorical_crossentropy',
        metrics=['accuracy'])
    return model_keras
In [37]:
tuner = RandomSearch(
    build_model,
    objective='val_accuracy',
    max_trials=5,
    executions_per_trial=3,
     project_name='Job_')
INFO:tensorflow:Reloading Tuner from .\Job_\tuner0.json
In [38]:
tuner.search_space_summary()
Search space summary
Default search space size: 12
num_layers (Int)
{'default': None, 'conditions': [], 'min_value': 2, 'max_value': 5, 'step': 1, 'sampling': 'linear'}
units_0 (Int)
{'default': None, 'conditions': [], 'min_value': 32, 'max_value': 256, 'step': 10, 'sampling': 'linear'}
act_0 (Choice)
{'default': 'relu', 'conditions': [], 'values': ['relu', 'sigmoid'], 'ordered': False}
units_1 (Int)
{'default': None, 'conditions': [], 'min_value': 32, 'max_value': 256, 'step': 10, 'sampling': 'linear'}
act_1 (Choice)
{'default': 'relu', 'conditions': [], 'values': ['relu', 'sigmoid'], 'ordered': False}
learning_rate (Choice)
{'default': 0.01, 'conditions': [], 'values': [0.01, 0.001, 0.0001, 1e-05], 'ordered': True}
units_2 (Int)
{'default': None, 'conditions': [], 'min_value': 32, 'max_value': 256, 'step': 10, 'sampling': 'linear'}
act_2 (Choice)
{'default': 'relu', 'conditions': [], 'values': ['relu', 'sigmoid'], 'ordered': False}
units_3 (Int)
{'default': None, 'conditions': [], 'min_value': 32, 'max_value': 256, 'step': 10, 'sampling': 'linear'}
act_3 (Choice)
{'default': 'relu', 'conditions': [], 'values': ['relu', 'sigmoid'], 'ordered': False}
units_4 (Int)
{'default': None, 'conditions': [], 'min_value': 32, 'max_value': 256, 'step': 10, 'sampling': 'linear'}
act_4 (Choice)
{'default': 'relu', 'conditions': [], 'values': ['relu', 'sigmoid'], 'ordered': False}
In [39]:
### Searching the best model on X and y train
tuner.search(X_train, y_cat_train,
             epochs=100,
             validation_split = 0.2, verbose=1)
INFO:tensorflow:Oracle triggered exit
In [40]:
## Printing the best models with their hyperparameters
tuner.results_summary()
Results summary
Results in .\Job_
Showing 10 best trials
<keras_tuner.engine.objective.Objective object at 0x0000019F40D5EDC0>
Trial summary
Hyperparameters:
num_layers: 4
units_0: 202
act_0: relu
units_1: 212
act_1: relu
learning_rate: 0.01
units_2: 112
act_2: sigmoid
units_3: 182
act_3: sigmoid
units_4: 212
act_4: sigmoid
Score: 0.6108202338218689
Trial summary
Hyperparameters:
num_layers: 5
units_0: 202
act_0: sigmoid
units_1: 162
act_1: relu
learning_rate: 0.0001
units_2: 32
act_2: relu
units_3: 32
act_3: relu
units_4: 32
act_4: relu
Score: 0.4624781807263692
Trial summary
Hyperparameters:
num_layers: 5
units_0: 62
act_0: sigmoid
units_1: 82
act_1: sigmoid
learning_rate: 0.0001
units_2: 112
act_2: sigmoid
units_3: 52
act_3: sigmoid
units_4: 152
act_4: sigmoid
Score: 0.4589877724647522
Trial summary
Hyperparameters:
num_layers: 5
units_0: 172
act_0: relu
units_1: 92
act_1: sigmoid
learning_rate: 0.001
units_2: 182
act_2: relu
units_3: 122
act_3: sigmoid
units_4: 122
act_4: relu
Score: 0.4031413495540619
Trial summary
Hyperparameters:
num_layers: 3
units_0: 212
act_0: sigmoid
units_1: 152
act_1: sigmoid
learning_rate: 1e-05
units_2: 72
act_2: relu
units_3: 82
act_3: relu
units_4: 52
act_4: relu
Score: 0.07678882777690887
In [41]:
backend.clear_session()
tf.random.set_seed(random_state)

model_keras = Sequential()

model_keras.add(Dense(202,activation='relu',kernel_initializer='he_uniform',input_dim = X_train.shape[1]))
model_keras.add(Dense(212,activation='relu',kernel_initializer='he_uniform'))
model_keras.add(Dense(112,activation='sigmoid',kernel_initializer='he_uniform'))
model_keras.add(Dense(182,activation='sigmoid',kernel_initializer='he_uniform'))
model_keras.add(Dense(212,activation='sigmoid',kernel_initializer='he_uniform'))

model_keras.add(layers.Dense(9, activation='softmax'))
In [42]:
optimizer = tf.keras.optimizers.SGD(0.01)
model_keras.compile(loss='categorical_crossentropy',optimizer=optimizer,metrics=['accuracy'])
In [43]:
model_keras.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 202)               2424      
                                                                 
 dense_1 (Dense)             (None, 212)               43036     
                                                                 
 dense_2 (Dense)             (None, 112)               23856     
                                                                 
 dense_3 (Dense)             (None, 182)               20566     
                                                                 
 dense_4 (Dense)             (None, 212)               38796     
                                                                 
 dense_5 (Dense)             (None, 9)                 1917      
                                                                 
=================================================================
Total params: 130,595
Trainable params: 130,595
Non-trainable params: 0
_________________________________________________________________
In [44]:
history_keras = model_keras.fit(x=X_train, y=y_cat_train, batch_size=20, epochs=100, validation_split=0.2, verbose=1)
Epoch 1/100
38/38 [==============================] - 1s 9ms/step - loss: 1.4809 - accuracy: 0.3895 - val_loss: 1.2525 - val_accuracy: 0.3874
Epoch 2/100
38/38 [==============================] - 0s 4ms/step - loss: 1.2533 - accuracy: 0.4276 - val_loss: 1.2252 - val_accuracy: 0.3874
Epoch 3/100
38/38 [==============================] - 0s 4ms/step - loss: 1.2377 - accuracy: 0.4171 - val_loss: 1.2120 - val_accuracy: 0.3874
Epoch 4/100
38/38 [==============================] - 0s 4ms/step - loss: 1.2305 - accuracy: 0.4184 - val_loss: 1.1957 - val_accuracy: 0.4346
Epoch 5/100
38/38 [==============================] - 0s 4ms/step - loss: 1.2276 - accuracy: 0.4237 - val_loss: 1.1887 - val_accuracy: 0.4293
Epoch 6/100
38/38 [==============================] - 0s 3ms/step - loss: 1.2208 - accuracy: 0.4237 - val_loss: 1.1842 - val_accuracy: 0.5079
Epoch 7/100
38/38 [==============================] - 0s 3ms/step - loss: 1.2214 - accuracy: 0.4289 - val_loss: 1.1911 - val_accuracy: 0.3874
Epoch 8/100
38/38 [==============================] - 0s 4ms/step - loss: 1.2165 - accuracy: 0.4382 - val_loss: 1.1757 - val_accuracy: 0.4450
Epoch 9/100
38/38 [==============================] - 0s 4ms/step - loss: 1.2106 - accuracy: 0.4395 - val_loss: 1.1738 - val_accuracy: 0.4607
Epoch 10/100
38/38 [==============================] - 0s 4ms/step - loss: 1.2114 - accuracy: 0.4513 - val_loss: 1.1705 - val_accuracy: 0.4398
Epoch 11/100
38/38 [==============================] - 0s 4ms/step - loss: 1.2106 - accuracy: 0.4355 - val_loss: 1.1831 - val_accuracy: 0.3874
Epoch 12/100
38/38 [==============================] - 0s 3ms/step - loss: 1.2073 - accuracy: 0.4500 - val_loss: 1.1701 - val_accuracy: 0.5393
Epoch 13/100
38/38 [==============================] - 0s 4ms/step - loss: 1.2056 - accuracy: 0.4474 - val_loss: 1.1703 - val_accuracy: 0.3979
Epoch 14/100
38/38 [==============================] - 0s 4ms/step - loss: 1.2003 - accuracy: 0.4724 - val_loss: 1.1836 - val_accuracy: 0.3874
Epoch 15/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1966 - accuracy: 0.4684 - val_loss: 1.1766 - val_accuracy: 0.3874
Epoch 16/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1966 - accuracy: 0.4829 - val_loss: 1.1553 - val_accuracy: 0.5026
Epoch 17/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1980 - accuracy: 0.4776 - val_loss: 1.1538 - val_accuracy: 0.5864
Epoch 18/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1917 - accuracy: 0.4855 - val_loss: 1.1643 - val_accuracy: 0.3874
Epoch 19/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1906 - accuracy: 0.5066 - val_loss: 1.1588 - val_accuracy: 0.4136
Epoch 20/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1863 - accuracy: 0.4868 - val_loss: 1.1478 - val_accuracy: 0.5707
Epoch 21/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1831 - accuracy: 0.5000 - val_loss: 1.1505 - val_accuracy: 0.4398
Epoch 22/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1806 - accuracy: 0.5145 - val_loss: 1.1402 - val_accuracy: 0.5759
Epoch 23/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1770 - accuracy: 0.4987 - val_loss: 1.1509 - val_accuracy: 0.4084
Epoch 24/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1729 - accuracy: 0.5382 - val_loss: 1.1385 - val_accuracy: 0.5340
Epoch 25/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1693 - accuracy: 0.5263 - val_loss: 1.1299 - val_accuracy: 0.5707
Epoch 26/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1651 - accuracy: 0.5250 - val_loss: 1.1249 - val_accuracy: 0.5707
Epoch 27/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1619 - accuracy: 0.5355 - val_loss: 1.1318 - val_accuracy: 0.5131
Epoch 28/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1575 - accuracy: 0.5237 - val_loss: 1.1335 - val_accuracy: 0.4398
Epoch 29/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1542 - accuracy: 0.5408 - val_loss: 1.1188 - val_accuracy: 0.5393
Epoch 30/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1509 - accuracy: 0.5329 - val_loss: 1.1073 - val_accuracy: 0.5812
Epoch 31/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1445 - accuracy: 0.5632 - val_loss: 1.1059 - val_accuracy: 0.5654
Epoch 32/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1384 - accuracy: 0.5539 - val_loss: 1.1029 - val_accuracy: 0.5759
Epoch 33/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1345 - accuracy: 0.5632 - val_loss: 1.0972 - val_accuracy: 0.5707
Epoch 34/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1275 - accuracy: 0.5605 - val_loss: 1.0919 - val_accuracy: 0.5602
Epoch 35/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1220 - accuracy: 0.5592 - val_loss: 1.0775 - val_accuracy: 0.5969
Epoch 36/100
38/38 [==============================] - 0s 5ms/step - loss: 1.1200 - accuracy: 0.5618 - val_loss: 1.0720 - val_accuracy: 0.5969
Epoch 37/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1170 - accuracy: 0.5579 - val_loss: 1.0669 - val_accuracy: 0.5916
Epoch 38/100
38/38 [==============================] - 0s 3ms/step - loss: 1.1075 - accuracy: 0.5724 - val_loss: 1.0812 - val_accuracy: 0.5550
Epoch 39/100
38/38 [==============================] - 0s 4ms/step - loss: 1.1006 - accuracy: 0.5711 - val_loss: 1.0536 - val_accuracy: 0.5969
Epoch 40/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0970 - accuracy: 0.5711 - val_loss: 1.0590 - val_accuracy: 0.5707
Epoch 41/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0910 - accuracy: 0.5711 - val_loss: 1.0426 - val_accuracy: 0.5969
Epoch 42/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0827 - accuracy: 0.5895 - val_loss: 1.0543 - val_accuracy: 0.5654
Epoch 43/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0833 - accuracy: 0.5632 - val_loss: 1.0318 - val_accuracy: 0.5812
Epoch 44/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0776 - accuracy: 0.5711 - val_loss: 1.0357 - val_accuracy: 0.5759
Epoch 45/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0671 - accuracy: 0.5855 - val_loss: 1.0281 - val_accuracy: 0.5759
Epoch 46/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0644 - accuracy: 0.5750 - val_loss: 1.0143 - val_accuracy: 0.6021
Epoch 47/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0560 - accuracy: 0.5789 - val_loss: 1.0114 - val_accuracy: 0.5969
Epoch 48/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0557 - accuracy: 0.5842 - val_loss: 1.0217 - val_accuracy: 0.5707
Epoch 49/100
38/38 [==============================] - 0s 4ms/step - loss: 1.0489 - accuracy: 0.5697 - val_loss: 1.0010 - val_accuracy: 0.6021
Epoch 50/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0441 - accuracy: 0.5816 - val_loss: 0.9965 - val_accuracy: 0.6073
Epoch 51/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0409 - accuracy: 0.5816 - val_loss: 0.9914 - val_accuracy: 0.5969
Epoch 52/100
38/38 [==============================] - 0s 4ms/step - loss: 1.0393 - accuracy: 0.5855 - val_loss: 0.9913 - val_accuracy: 0.5969
Epoch 53/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0336 - accuracy: 0.5789 - val_loss: 0.9865 - val_accuracy: 0.6021
Epoch 54/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0322 - accuracy: 0.5868 - val_loss: 0.9815 - val_accuracy: 0.5969
Epoch 55/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0275 - accuracy: 0.5816 - val_loss: 0.9785 - val_accuracy: 0.5969
Epoch 56/100
38/38 [==============================] - 0s 4ms/step - loss: 1.0247 - accuracy: 0.5882 - val_loss: 0.9828 - val_accuracy: 0.5812
Epoch 57/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0209 - accuracy: 0.5855 - val_loss: 0.9734 - val_accuracy: 0.6021
Epoch 58/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0183 - accuracy: 0.5934 - val_loss: 0.9766 - val_accuracy: 0.5864
Epoch 59/100
38/38 [==============================] - 0s 4ms/step - loss: 1.0151 - accuracy: 0.5737 - val_loss: 0.9682 - val_accuracy: 0.6021
Epoch 60/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0105 - accuracy: 0.5855 - val_loss: 0.9647 - val_accuracy: 0.5969
Epoch 61/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0099 - accuracy: 0.5921 - val_loss: 0.9611 - val_accuracy: 0.5916
Epoch 62/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0052 - accuracy: 0.5921 - val_loss: 0.9615 - val_accuracy: 0.6073
Epoch 63/100
38/38 [==============================] - 0s 4ms/step - loss: 1.0042 - accuracy: 0.5895 - val_loss: 0.9714 - val_accuracy: 0.5916
Epoch 64/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0021 - accuracy: 0.5789 - val_loss: 0.9556 - val_accuracy: 0.5916
Epoch 65/100
38/38 [==============================] - 0s 3ms/step - loss: 1.0005 - accuracy: 0.5921 - val_loss: 0.9552 - val_accuracy: 0.6021
Epoch 66/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9999 - accuracy: 0.5868 - val_loss: 0.9520 - val_accuracy: 0.6021
Epoch 67/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9978 - accuracy: 0.5789 - val_loss: 0.9489 - val_accuracy: 0.5969
Epoch 68/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9970 - accuracy: 0.5882 - val_loss: 0.9610 - val_accuracy: 0.5916
Epoch 69/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9958 - accuracy: 0.5882 - val_loss: 0.9467 - val_accuracy: 0.5916
Epoch 70/100
38/38 [==============================] - 0s 4ms/step - loss: 0.9927 - accuracy: 0.5974 - val_loss: 0.9501 - val_accuracy: 0.6073
Epoch 71/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9869 - accuracy: 0.5921 - val_loss: 0.9612 - val_accuracy: 0.6178
Epoch 72/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9904 - accuracy: 0.5908 - val_loss: 0.9471 - val_accuracy: 0.5969
Epoch 73/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9883 - accuracy: 0.5868 - val_loss: 0.9432 - val_accuracy: 0.5969
Epoch 74/100
38/38 [==============================] - 0s 4ms/step - loss: 0.9862 - accuracy: 0.5895 - val_loss: 0.9420 - val_accuracy: 0.5969
Epoch 75/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9830 - accuracy: 0.5947 - val_loss: 0.9523 - val_accuracy: 0.6335
Epoch 76/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9822 - accuracy: 0.6013 - val_loss: 0.9443 - val_accuracy: 0.6073
Epoch 77/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9805 - accuracy: 0.5816 - val_loss: 0.9414 - val_accuracy: 0.5916
Epoch 78/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9815 - accuracy: 0.5908 - val_loss: 0.9367 - val_accuracy: 0.5969
Epoch 79/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9767 - accuracy: 0.5882 - val_loss: 0.9387 - val_accuracy: 0.6021
Epoch 80/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9782 - accuracy: 0.5947 - val_loss: 0.9458 - val_accuracy: 0.6126
Epoch 81/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9780 - accuracy: 0.5908 - val_loss: 0.9363 - val_accuracy: 0.5969
Epoch 82/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9731 - accuracy: 0.5974 - val_loss: 0.9339 - val_accuracy: 0.5916
Epoch 83/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9727 - accuracy: 0.5816 - val_loss: 0.9363 - val_accuracy: 0.6021
Epoch 84/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9739 - accuracy: 0.5921 - val_loss: 0.9351 - val_accuracy: 0.6021
Epoch 85/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9711 - accuracy: 0.5961 - val_loss: 0.9320 - val_accuracy: 0.5812
Epoch 86/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9716 - accuracy: 0.5816 - val_loss: 0.9356 - val_accuracy: 0.6021
Epoch 87/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9653 - accuracy: 0.6066 - val_loss: 0.9676 - val_accuracy: 0.6021
Epoch 88/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9728 - accuracy: 0.5855 - val_loss: 0.9363 - val_accuracy: 0.6283
Epoch 89/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9666 - accuracy: 0.5947 - val_loss: 0.9349 - val_accuracy: 0.6283
Epoch 90/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9683 - accuracy: 0.5934 - val_loss: 0.9296 - val_accuracy: 0.5864
Epoch 91/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9646 - accuracy: 0.5974 - val_loss: 0.9301 - val_accuracy: 0.5812
Epoch 92/100
38/38 [==============================] - 0s 4ms/step - loss: 0.9656 - accuracy: 0.5895 - val_loss: 0.9286 - val_accuracy: 0.5969
Epoch 93/100
38/38 [==============================] - 0s 4ms/step - loss: 0.9638 - accuracy: 0.5987 - val_loss: 0.9446 - val_accuracy: 0.6283
Epoch 94/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9608 - accuracy: 0.5961 - val_loss: 0.9286 - val_accuracy: 0.5916
Epoch 95/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9658 - accuracy: 0.5961 - val_loss: 0.9280 - val_accuracy: 0.6021
Epoch 96/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9585 - accuracy: 0.6000 - val_loss: 0.9287 - val_accuracy: 0.6021
Epoch 97/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9618 - accuracy: 0.6026 - val_loss: 0.9331 - val_accuracy: 0.6230
Epoch 98/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9547 - accuracy: 0.5987 - val_loss: 0.9297 - val_accuracy: 0.6021
Epoch 99/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9626 - accuracy: 0.6013 - val_loss: 0.9234 - val_accuracy: 0.5812
Epoch 100/100
38/38 [==============================] - 0s 3ms/step - loss: 0.9586 - accuracy: 0.6013 - val_loss: 0.9262 - val_accuracy: 0.6073
In [45]:
# Capturing learning history per epoch
hist_keras  = pd.DataFrame(history_keras.history)
hist_keras['epoch'] = history_keras.epoch

# Plotting Loss at different epochs
plt.title('Training Loss vs Validation Loss',fontsize=15,color="green")
plt.plot(hist_keras['loss'])
plt.plot(hist_keras['val_loss'])
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()

# Plotting Accuracy at different epochs
plt.title('Training Accuracy vs Validation Accuracy',fontsize=15,color="green")
plt.plot(hist_keras['accuracy'])
plt.plot(hist_keras['val_accuracy'])
plt.ylabel('accuracy')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()
In [46]:
# calculate score of training data
model_keras.evaluate(X_train, y_cat_train, batch_size=20, verbose=1)
48/48 [==============================] - 0s 2ms/step - loss: 0.9469 - accuracy: 0.6078
Out[46]:
[0.9469315409660339, 0.6077812910079956]
In [47]:
# calculate score of testing data
model_keras.evaluate(X_test, y_cat_test, batch_size=20, verbose=1)
21/21 [==============================] - 0s 2ms/step - loss: 1.0047 - accuracy: 0.5931
Out[47]:
[1.0047204494476318, 0.593137264251709]
In [48]:
# Predicting for X_test
y_pred_keras = model_keras.predict(X_test)
y_pred_keras
13/13 [==============================] - 0s 2ms/step
Out[48]:
array([[1.8887123e-04, 1.6787344e-04, 1.3803072e-04, ..., 1.8187954e-01,
        9.0554105e-03, 4.5836507e-03],
       [2.9591320e-04, 2.8368965e-04, 2.4793879e-04, ..., 3.2496709e-01,
        3.1332456e-02, 9.5211444e-03],
       [2.2973996e-04, 2.1991009e-04, 2.7420151e-04, ..., 4.6292165e-01,
        4.5346698e-01, 2.4619879e-02],
       ...,
       [3.2492119e-04, 3.2192259e-04, 3.5399600e-04, ..., 5.5859345e-01,
        2.6717067e-01, 2.3405660e-02],
       [3.5693907e-04, 3.3271729e-04, 3.3872898e-04, ..., 4.6509126e-01,
        7.1178176e-02, 1.5960392e-02],
       [2.1294493e-04, 1.9088805e-04, 1.5998697e-04, ..., 2.1068053e-01,
        1.1996112e-02, 5.5889399e-03]], dtype=float32)
In [49]:
y_pred_keras_final = []
for i in y_pred_keras:
    y_pred_keras_final.append(np.argmax(i))
print(y_pred_keras_final)
[5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 5, 6, 5, 5, 6, 5, 5, 5, 6, 5, 5, 6, 5, 5, 6, 5, 5, 7, 5, 6, 6, 5, 6, 5, 5, 6, 7, 5, 5, 7, 5, 6, 5, 6, 6, 5, 6, 6, 6, 6, 5, 5, 6, 6, 6, 5, 6, 5, 5, 5, 7, 6, 6, 5, 6, 5, 6, 5, 6, 6, 6, 5, 6, 6, 6, 5, 6, 5, 6, 6, 5, 6, 6, 5, 5, 6, 6, 5, 6, 6, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 6, 5, 6, 5, 5, 6, 5, 6, 5, 7, 5, 5, 6, 6, 5, 6, 6, 6, 5, 7, 5, 6, 7, 6, 5, 6, 5, 6, 5, 6, 6, 5, 5, 6, 5, 6, 5, 5, 6, 6, 5, 5, 5, 6, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 6, 5, 6, 6, 5, 6, 5, 5, 5, 6, 6, 5, 5, 5, 6, 6, 6, 5, 5, 6, 6, 5, 5, 6, 5, 6, 5, 5, 7, 6, 5, 6, 5, 5, 6, 5, 6, 6, 7, 6, 6, 6, 6, 5, 6, 5, 5, 6, 6, 6, 6, 6, 5, 7, 6, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 5, 5, 6, 6, 5, 7, 5, 5, 5, 6, 5, 5, 6, 6, 6, 5, 5, 5, 6, 5, 5, 5, 6, 6, 5, 6, 5, 6, 6, 6, 6, 5, 5, 5, 5, 7, 5, 6, 6, 5, 6, 5, 6, 6, 5, 6, 5, 5, 6, 6, 5, 5, 5, 6, 6, 5, 5, 7, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 5, 6, 6, 5, 7, 5, 5, 5, 7, 5, 6, 6, 6, 6, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 5, 6, 5, 5, 6, 5, 5, 6, 5, 5, 6, 6, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 6, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, 6, 5, 6, 6, 5, 5, 5, 6, 6, 7, 5, 6, 6, 6, 5, 5, 5, 5, 6, 6, 5, 5, 6, 5, 6, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 6, 6, 5]
In [50]:
print('Classification Report')
print(classification_report(y_test, y_pred_keras_final))
Classification Report
              precision    recall  f1-score   support

           3       0.00      0.00      0.00         3
           4       0.00      0.00      0.00        16
           5       0.65      0.76      0.70       173
           6       0.53      0.63      0.58       161
           7       0.56      0.18      0.27        50
           8       0.00      0.00      0.00         5

    accuracy                           0.59       408
   macro avg       0.29      0.26      0.26       408
weighted avg       0.56      0.59      0.56       408

In [51]:
cm = confusion_matrix(y_test.tolist(), y_pred_keras_final)

plt.figure(figsize=(10, 7))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=[3, 4, 5, 6, 7, 8], yticklabels=[3, 4, 5, 6, 7, 8])
plt.xlabel('Predicted')
plt.ylabel('Truth')
plt.show()
  • After tuning hyperparameters, both accuracy for train and test dataset have been closer.
  • Different techniques can be used for tunning and more improvement techniques can be used like, Dropout, weight initialization, regularization and more.
  • Change in confusion matrix, with increased f1-score values for some labels(5,6) with drop in another label(7).
#¶

PART-B¶

#¶

1. Data Import and Exploration¶

A. Read the .h5 file and assign to a variable.¶

In [52]:
# svhn_hf=h5py.File('/content/drive/MyDrive/GL/Autonomous_Vehicles_SVHN_single_grey1.h5','r')
svhn_hf = h5py.File('Autonomous_Vehicles_SVHN_single_grey1.h5', 'r')
svhn_hf
Out[52]:
<HDF5 file "Autonomous_Vehicles_SVHN_single_grey1.h5" (mode r)>

B. Print all the keys from the .h5 file.¶

In [53]:
svhn_hf.keys()
Out[53]:
<KeysViewHDF5 ['X_test', 'X_train', 'X_val', 'y_test', 'y_train', 'y_val']>

Different keys are present, i.e.:

  • Train dataset:
    • X_train
    • X_val
    • y_train
  • Test dataset:
    • X_test
    • y_test
    • y_val

C. Split the data into X_train, X_test, Y_train, Y_test¶

In [54]:
X_svhn_train = svhn_hf['X_train'][:]
y_svhn_train = svhn_hf['y_train'][:]
X_svhn_val = svhn_hf['X_val'][:]
X_svhn_test = svhn_hf['X_test'][:]
y_svhn_test = svhn_hf['y_test'][:]
y_svhn_val = svhn_hf['y_val'][:]

svhn_hf.close()

2. Data Visualisation and preprocessing¶

A. Print shape of all the 4 data split into x, y, train, test to verify if x & y is in sync.¶

In [55]:
print('X_train:', X_svhn_train.shape)
print('y_train:', y_svhn_train.shape)
print('X_test:', X_svhn_test.shape)
print('y_test:', y_svhn_test.shape)
print('X_val:', X_svhn_val.shape)
print('y_val:', y_svhn_val.shape)
X_train: (42000, 32, 32)
y_train: (42000,)
X_test: (18000, 32, 32)
y_test: (18000,)
X_val: (60000, 32, 32)
y_val: (60000,)

All datasets are in sync with records and features for all train, test and val set.

B. Visualise first 10 images in train data and print its corresponding labels.¶

In [56]:
fig=plt.figure(figsize=(15,7))
for i in range(0,10):
   ax=fig.add_subplot(2,5,i+1)
   plt.title(y_svhn_train[i], fontsize=30, color="green") #labels
   plt.imshow(X_svhn_train[i], cmap='gray')
plt.tight_layout()
plt.show()

C. Reshape all the images with appropriate shape update the data in same variable.¶

In [57]:
X_svhn_train=X_svhn_train.reshape(X_svhn_train.shape[0], -1)
X_svhn_test=X_svhn_test.reshape(X_svhn_test.shape[0], -1)
X_svhn_val=X_svhn_val.reshape(X_svhn_val.shape[0], -1)
In [58]:
print('X_train:', X_svhn_train.shape)
print('X_test:', X_svhn_test.shape)
print('X_val:', X_svhn_val.shape)
X_train: (42000, 1024)
X_test: (18000, 1024)
X_val: (60000, 1024)

D. Normalise the images i.e. Normalise the pixel values.¶

In [59]:
#As the pixel values range from 0 to 256, apart from 0 the range is 255. So dividing all the values by 255 will convert it to range from 0 to 1.
X_svhn_train=X_svhn_train.astype('float32')/255.0
X_svhn_test=X_svhn_test.astype('float32')/255.0
X_svhn_val=X_svhn_val.astype('float32')/255.0

E. Transform Labels into format acceptable by Neural Network¶

In [60]:
# Convert to "one-hot" vectors using the to_categorical function
num_classes = 10
y_svhn_train = to_categorical(y_svhn_train, num_classes)
y_svhn_val = to_categorical(y_svhn_val, num_classes)
y_svhn_test_cat=to_categorical(y_svhn_test,num_classes)

print('y_train:', y_svhn_train.shape)
print('y_test_cat:', y_svhn_test_cat.shape)
print('y_val:', y_svhn_val.shape)
y_train: (42000, 10)
y_test_cat: (18000, 10)
y_val: (60000, 10)

F. Print total Number of classes in the Dataset.¶

In [61]:
print('X_train:', X_svhn_train.shape)
print('y_train:', y_svhn_train.shape)
print('X_test:', X_svhn_test.shape)
print('y_test:', y_svhn_test_cat.shape)
print('X_val:', X_svhn_val.shape)
print('y_val:', y_svhn_val.shape)
X_train: (42000, 1024)
y_train: (42000, 10)
X_test: (18000, 1024)
y_test: (18000, 10)
X_val: (60000, 1024)
y_val: (60000, 10)
In [62]:
#Classes present for target class
print(pd.DataFrame(y_svhn_train).columns)
RangeIndex(start=0, stop=10, step=1)

Classes are present for : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

3. Model Training & Evaluation using Neural Network¶

A. Design a Neural Network to train a classifier.¶

B. Train the classifier using previously designed Architecture (Use best suitable parameters).¶

C. Evaluate performance of the model with appropriate metrics.¶

D. Plot the training loss, validation loss vs number of epochs and training accuracy, validation accuracy vs number of epochs plot and write your observations on the same.¶

In [63]:
backend.clear_session()
tf.random.set_seed(random_state)

# create model
svhn_model = Sequential()

svhn_model.add(Dense(256, activation='relu',kernel_initializer='he_normal',input_shape=(32*32,))) ###Multiple Dense units with Relu activation
svhn_model.add(BatchNormalization())
svhn_model.add(Dense(128, activation='relu',kernel_initializer='he_normal'))
svhn_model.add(BatchNormalization())
svhn_model.add(Dense(64, activation='relu',kernel_initializer='he_normal'))
svhn_model.add(BatchNormalization())
svhn_model.add(Dense(64, activation='relu',kernel_initializer='he_normal'))
svhn_model.add(BatchNormalization())
svhn_model.add(Dense(32, activation='relu',kernel_initializer='he_normal'))
svhn_model.add(BatchNormalization())

svhn_model.add(Dense(num_classes,activation='softmax')) ### For multiclass classification Softmax is used

# Compile model
adam = optimizers.Adam(learning_rate=1e-5)
svhn_model.compile(loss=losses.categorical_crossentropy, optimizer=adam, metrics=['accuracy']) ### Loss function = Categorical cross entropy
In [64]:
## Looking into our base model
svhn_model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 256)               262400    
                                                                 
 batch_normalization (BatchN  (None, 256)              1024      
 ormalization)                                                   
                                                                 
 dense_1 (Dense)             (None, 128)               32896     
                                                                 
 batch_normalization_1 (Batc  (None, 128)              512       
 hNormalization)                                                 
                                                                 
 dense_2 (Dense)             (None, 64)                8256      
                                                                 
 batch_normalization_2 (Batc  (None, 64)               256       
 hNormalization)                                                 
                                                                 
 dense_3 (Dense)             (None, 64)                4160      
                                                                 
 batch_normalization_3 (Batc  (None, 64)               256       
 hNormalization)                                                 
                                                                 
 dense_4 (Dense)             (None, 32)                2080      
                                                                 
 batch_normalization_4 (Batc  (None, 32)               128       
 hNormalization)                                                 
                                                                 
 dense_5 (Dense)             (None, 10)                330       
                                                                 
=================================================================
Total params: 312,298
Trainable params: 311,210
Non-trainable params: 1,088
_________________________________________________________________
In [65]:
# Fit the model
svhn_history=svhn_model.fit(X_svhn_train, y_svhn_train, validation_data=(X_svhn_val, y_svhn_val) , epochs=100, batch_size=100, verbose=1)
Epoch 1/100
420/420 [==============================] - 7s 12ms/step - loss: 2.7065 - accuracy: 0.1136 - val_loss: 2.4908 - val_accuracy: 0.1268
Epoch 2/100
420/420 [==============================] - 4s 10ms/step - loss: 2.5273 - accuracy: 0.1406 - val_loss: 2.4866 - val_accuracy: 0.1575
Epoch 3/100
420/420 [==============================] - 4s 11ms/step - loss: 2.4153 - accuracy: 0.1671 - val_loss: 2.3666 - val_accuracy: 0.1813
Epoch 4/100
420/420 [==============================] - 4s 10ms/step - loss: 2.3139 - accuracy: 0.1942 - val_loss: 2.2806 - val_accuracy: 0.2086
Epoch 5/100
420/420 [==============================] - 4s 10ms/step - loss: 2.2250 - accuracy: 0.2225 - val_loss: 2.1843 - val_accuracy: 0.2371
Epoch 6/100
420/420 [==============================] - 4s 10ms/step - loss: 2.1448 - accuracy: 0.2526 - val_loss: 2.1061 - val_accuracy: 0.2640
Epoch 7/100
420/420 [==============================] - 4s 10ms/step - loss: 2.0655 - accuracy: 0.2799 - val_loss: 2.0279 - val_accuracy: 0.2985
Epoch 8/100
420/420 [==============================] - 4s 10ms/step - loss: 1.9917 - accuracy: 0.3097 - val_loss: 1.9530 - val_accuracy: 0.3319
Epoch 9/100
420/420 [==============================] - 4s 10ms/step - loss: 1.9228 - accuracy: 0.3385 - val_loss: 1.8752 - val_accuracy: 0.3607
Epoch 10/100
420/420 [==============================] - 4s 10ms/step - loss: 1.8581 - accuracy: 0.3654 - val_loss: 1.8042 - val_accuracy: 0.3915
Epoch 11/100
420/420 [==============================] - 4s 10ms/step - loss: 1.7970 - accuracy: 0.3904 - val_loss: 1.7470 - val_accuracy: 0.4192
Epoch 12/100
420/420 [==============================] - 4s 10ms/step - loss: 1.7428 - accuracy: 0.4182 - val_loss: 1.6928 - val_accuracy: 0.4430
Epoch 13/100
420/420 [==============================] - 4s 10ms/step - loss: 1.6866 - accuracy: 0.4415 - val_loss: 1.6278 - val_accuracy: 0.4689
Epoch 14/100
420/420 [==============================] - 4s 10ms/step - loss: 1.6331 - accuracy: 0.4640 - val_loss: 1.5885 - val_accuracy: 0.4824
Epoch 15/100
420/420 [==============================] - 4s 11ms/step - loss: 1.5874 - accuracy: 0.4826 - val_loss: 1.5396 - val_accuracy: 0.5059
Epoch 16/100
420/420 [==============================] - 4s 10ms/step - loss: 1.5417 - accuracy: 0.5030 - val_loss: 1.4969 - val_accuracy: 0.5268
Epoch 17/100
420/420 [==============================] - 4s 10ms/step - loss: 1.4994 - accuracy: 0.5205 - val_loss: 1.4759 - val_accuracy: 0.5344
Epoch 18/100
420/420 [==============================] - 4s 10ms/step - loss: 1.4597 - accuracy: 0.5336 - val_loss: 1.4150 - val_accuracy: 0.5543
Epoch 19/100
420/420 [==============================] - 4s 11ms/step - loss: 1.4261 - accuracy: 0.5469 - val_loss: 1.3780 - val_accuracy: 0.5713
Epoch 20/100
420/420 [==============================] - 4s 11ms/step - loss: 1.3857 - accuracy: 0.5645 - val_loss: 1.3324 - val_accuracy: 0.5901
Epoch 21/100
420/420 [==============================] - 4s 11ms/step - loss: 1.3549 - accuracy: 0.5776 - val_loss: 1.3037 - val_accuracy: 0.6013
Epoch 22/100
420/420 [==============================] - 4s 11ms/step - loss: 1.3234 - accuracy: 0.5884 - val_loss: 1.2772 - val_accuracy: 0.6098
Epoch 23/100
420/420 [==============================] - 4s 11ms/step - loss: 1.2923 - accuracy: 0.5993 - val_loss: 1.2412 - val_accuracy: 0.6204
Epoch 24/100
420/420 [==============================] - 4s 11ms/step - loss: 1.2625 - accuracy: 0.6109 - val_loss: 1.2178 - val_accuracy: 0.6297
Epoch 25/100
420/420 [==============================] - 4s 11ms/step - loss: 1.2407 - accuracy: 0.6180 - val_loss: 1.1985 - val_accuracy: 0.6365
Epoch 26/100
420/420 [==============================] - 5s 11ms/step - loss: 1.2140 - accuracy: 0.6282 - val_loss: 1.1666 - val_accuracy: 0.6485
Epoch 27/100
420/420 [==============================] - 4s 11ms/step - loss: 1.1905 - accuracy: 0.6337 - val_loss: 1.1438 - val_accuracy: 0.6533
Epoch 28/100
420/420 [==============================] - 5s 11ms/step - loss: 1.1700 - accuracy: 0.6427 - val_loss: 1.1312 - val_accuracy: 0.6613
Epoch 29/100
420/420 [==============================] - 4s 11ms/step - loss: 1.1498 - accuracy: 0.6493 - val_loss: 1.1006 - val_accuracy: 0.6679
Epoch 30/100
420/420 [==============================] - 5s 11ms/step - loss: 1.1320 - accuracy: 0.6553 - val_loss: 1.0848 - val_accuracy: 0.6731
Epoch 31/100
420/420 [==============================] - 4s 11ms/step - loss: 1.1142 - accuracy: 0.6583 - val_loss: 1.0698 - val_accuracy: 0.6761
Epoch 32/100
420/420 [==============================] - 4s 11ms/step - loss: 1.0979 - accuracy: 0.6652 - val_loss: 1.0552 - val_accuracy: 0.6817
Epoch 33/100
420/420 [==============================] - 5s 11ms/step - loss: 1.0834 - accuracy: 0.6680 - val_loss: 1.0356 - val_accuracy: 0.6880
Epoch 34/100
420/420 [==============================] - 4s 11ms/step - loss: 1.0653 - accuracy: 0.6742 - val_loss: 1.0205 - val_accuracy: 0.6932
Epoch 35/100
420/420 [==============================] - 4s 11ms/step - loss: 1.0525 - accuracy: 0.6785 - val_loss: 1.0147 - val_accuracy: 0.6941
Epoch 36/100
420/420 [==============================] - 5s 11ms/step - loss: 1.0385 - accuracy: 0.6833 - val_loss: 0.9935 - val_accuracy: 0.7001
Epoch 37/100
420/420 [==============================] - 4s 11ms/step - loss: 1.0261 - accuracy: 0.6854 - val_loss: 0.9811 - val_accuracy: 0.7034
Epoch 38/100
420/420 [==============================] - 4s 11ms/step - loss: 1.0111 - accuracy: 0.6910 - val_loss: 0.9721 - val_accuracy: 0.7075
Epoch 39/100
420/420 [==============================] - 4s 11ms/step - loss: 1.0023 - accuracy: 0.6927 - val_loss: 0.9501 - val_accuracy: 0.7139
Epoch 40/100
420/420 [==============================] - 4s 11ms/step - loss: 0.9908 - accuracy: 0.6953 - val_loss: 0.9450 - val_accuracy: 0.7141
Epoch 41/100
420/420 [==============================] - 5s 11ms/step - loss: 0.9805 - accuracy: 0.7016 - val_loss: 0.9359 - val_accuracy: 0.7168
Epoch 42/100
420/420 [==============================] - 4s 11ms/step - loss: 0.9699 - accuracy: 0.7026 - val_loss: 0.9274 - val_accuracy: 0.7199
Epoch 43/100
420/420 [==============================] - 5s 11ms/step - loss: 0.9602 - accuracy: 0.7050 - val_loss: 0.9254 - val_accuracy: 0.7191
Epoch 44/100
420/420 [==============================] - 4s 11ms/step - loss: 0.9477 - accuracy: 0.7093 - val_loss: 0.9014 - val_accuracy: 0.7278
Epoch 45/100
420/420 [==============================] - 5s 12ms/step - loss: 0.9411 - accuracy: 0.7114 - val_loss: 0.8937 - val_accuracy: 0.7310
Epoch 46/100
420/420 [==============================] - 5s 12ms/step - loss: 0.9303 - accuracy: 0.7141 - val_loss: 0.8905 - val_accuracy: 0.7299
Epoch 47/100
420/420 [==============================] - 5s 12ms/step - loss: 0.9176 - accuracy: 0.7188 - val_loss: 0.8754 - val_accuracy: 0.7359
Epoch 48/100
420/420 [==============================] - 5s 12ms/step - loss: 0.9148 - accuracy: 0.7164 - val_loss: 0.8886 - val_accuracy: 0.7285
Epoch 49/100
420/420 [==============================] - 5s 12ms/step - loss: 0.9033 - accuracy: 0.7239 - val_loss: 0.8625 - val_accuracy: 0.7376
Epoch 50/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8975 - accuracy: 0.7237 - val_loss: 0.8550 - val_accuracy: 0.7389
Epoch 51/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8884 - accuracy: 0.7259 - val_loss: 0.8527 - val_accuracy: 0.7418
Epoch 52/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8823 - accuracy: 0.7291 - val_loss: 0.8484 - val_accuracy: 0.7408
Epoch 53/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8725 - accuracy: 0.7298 - val_loss: 0.8432 - val_accuracy: 0.7445
Epoch 54/100
420/420 [==============================] - 6s 13ms/step - loss: 0.8703 - accuracy: 0.7308 - val_loss: 0.8265 - val_accuracy: 0.7495
Epoch 55/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8611 - accuracy: 0.7349 - val_loss: 0.8194 - val_accuracy: 0.7515
Epoch 56/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8540 - accuracy: 0.7365 - val_loss: 0.8252 - val_accuracy: 0.7483
Epoch 57/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8473 - accuracy: 0.7392 - val_loss: 0.8076 - val_accuracy: 0.7545
Epoch 58/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8391 - accuracy: 0.7406 - val_loss: 0.8093 - val_accuracy: 0.7533
Epoch 59/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8365 - accuracy: 0.7432 - val_loss: 0.8062 - val_accuracy: 0.7537
Epoch 60/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8297 - accuracy: 0.7430 - val_loss: 0.7930 - val_accuracy: 0.7590
Epoch 61/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8257 - accuracy: 0.7447 - val_loss: 0.8002 - val_accuracy: 0.7553
Epoch 62/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8175 - accuracy: 0.7474 - val_loss: 0.7889 - val_accuracy: 0.7585
Epoch 63/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8109 - accuracy: 0.7491 - val_loss: 0.7885 - val_accuracy: 0.7595
Epoch 64/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8044 - accuracy: 0.7509 - val_loss: 0.7779 - val_accuracy: 0.7619
Epoch 65/100
420/420 [==============================] - 5s 12ms/step - loss: 0.8031 - accuracy: 0.7522 - val_loss: 0.7689 - val_accuracy: 0.7647
Epoch 66/100
420/420 [==============================] - 5s 11ms/step - loss: 0.7944 - accuracy: 0.7536 - val_loss: 0.7695 - val_accuracy: 0.7653
Epoch 67/100
420/420 [==============================] - 5s 11ms/step - loss: 0.7904 - accuracy: 0.7550 - val_loss: 0.7716 - val_accuracy: 0.7630
Epoch 68/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7838 - accuracy: 0.7571 - val_loss: 0.7655 - val_accuracy: 0.7648
Epoch 69/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7791 - accuracy: 0.7584 - val_loss: 0.7520 - val_accuracy: 0.7705
Epoch 70/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7751 - accuracy: 0.7601 - val_loss: 0.7606 - val_accuracy: 0.7671
Epoch 71/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7688 - accuracy: 0.7604 - val_loss: 0.7409 - val_accuracy: 0.7737
Epoch 72/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7651 - accuracy: 0.7619 - val_loss: 0.7383 - val_accuracy: 0.7745
Epoch 73/100
420/420 [==============================] - 5s 11ms/step - loss: 0.7581 - accuracy: 0.7655 - val_loss: 0.7279 - val_accuracy: 0.7778
Epoch 74/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7554 - accuracy: 0.7656 - val_loss: 0.7312 - val_accuracy: 0.7766
Epoch 75/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7517 - accuracy: 0.7675 - val_loss: 0.7191 - val_accuracy: 0.7807
Epoch 76/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7460 - accuracy: 0.7691 - val_loss: 0.7226 - val_accuracy: 0.7789
Epoch 77/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7425 - accuracy: 0.7689 - val_loss: 0.7184 - val_accuracy: 0.7804
Epoch 78/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7360 - accuracy: 0.7715 - val_loss: 0.7140 - val_accuracy: 0.7816
Epoch 79/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7312 - accuracy: 0.7716 - val_loss: 0.7049 - val_accuracy: 0.7851
Epoch 80/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7326 - accuracy: 0.7728 - val_loss: 0.7053 - val_accuracy: 0.7834
Epoch 81/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7270 - accuracy: 0.7737 - val_loss: 0.7018 - val_accuracy: 0.7865
Epoch 82/100
420/420 [==============================] - 6s 13ms/step - loss: 0.7247 - accuracy: 0.7737 - val_loss: 0.6979 - val_accuracy: 0.7864
Epoch 83/100
420/420 [==============================] - 5s 12ms/step - loss: 0.7145 - accuracy: 0.7788 - val_loss: 0.6963 - val_accuracy: 0.7871
Epoch 84/100
420/420 [==============================] - 5s 11ms/step - loss: 0.7093 - accuracy: 0.7807 - val_loss: 0.6868 - val_accuracy: 0.7910
Epoch 85/100
420/420 [==============================] - 5s 11ms/step - loss: 0.7077 - accuracy: 0.7794 - val_loss: 0.6879 - val_accuracy: 0.7910
Epoch 86/100
420/420 [==============================] - 4s 11ms/step - loss: 0.7090 - accuracy: 0.7815 - val_loss: 0.6873 - val_accuracy: 0.7897
Epoch 87/100
420/420 [==============================] - 4s 11ms/step - loss: 0.7010 - accuracy: 0.7817 - val_loss: 0.6841 - val_accuracy: 0.7894
Epoch 88/100
420/420 [==============================] - 4s 11ms/step - loss: 0.6985 - accuracy: 0.7817 - val_loss: 0.6832 - val_accuracy: 0.7905
Epoch 89/100
420/420 [==============================] - 4s 11ms/step - loss: 0.6961 - accuracy: 0.7827 - val_loss: 0.6780 - val_accuracy: 0.7922
Epoch 90/100
420/420 [==============================] - 5s 11ms/step - loss: 0.6938 - accuracy: 0.7846 - val_loss: 0.6784 - val_accuracy: 0.7926
Epoch 91/100
420/420 [==============================] - 5s 11ms/step - loss: 0.6854 - accuracy: 0.7869 - val_loss: 0.6699 - val_accuracy: 0.7944
Epoch 92/100
420/420 [==============================] - 4s 11ms/step - loss: 0.6846 - accuracy: 0.7868 - val_loss: 0.6655 - val_accuracy: 0.7969
Epoch 93/100
420/420 [==============================] - 5s 11ms/step - loss: 0.6827 - accuracy: 0.7871 - val_loss: 0.6632 - val_accuracy: 0.7976
Epoch 94/100
420/420 [==============================] - 4s 11ms/step - loss: 0.6789 - accuracy: 0.7892 - val_loss: 0.6674 - val_accuracy: 0.7943
Epoch 95/100
420/420 [==============================] - 4s 11ms/step - loss: 0.6674 - accuracy: 0.7949 - val_loss: 0.6511 - val_accuracy: 0.8014
Epoch 96/100
420/420 [==============================] - 5s 11ms/step - loss: 0.6698 - accuracy: 0.7920 - val_loss: 0.6500 - val_accuracy: 0.8009
Epoch 97/100
420/420 [==============================] - 4s 11ms/step - loss: 0.6658 - accuracy: 0.7918 - val_loss: 0.6428 - val_accuracy: 0.8043
Epoch 98/100
420/420 [==============================] - 5s 11ms/step - loss: 0.6664 - accuracy: 0.7938 - val_loss: 0.6545 - val_accuracy: 0.7989
Epoch 99/100
420/420 [==============================] - 4s 11ms/step - loss: 0.6613 - accuracy: 0.7937 - val_loss: 0.6483 - val_accuracy: 0.8009
Epoch 100/100
420/420 [==============================] - 5s 11ms/step - loss: 0.6557 - accuracy: 0.7942 - val_loss: 0.6435 - val_accuracy: 0.8034
In [66]:
# Capturing learning history per epoch
svhn_hist  = pd.DataFrame(svhn_history.history)
svhn_hist['epoch'] = svhn_history.epoch

# Plotting Loss at different epochs
plt.title('Training Loss vs Validation Loss',fontsize=15,color="green")
plt.plot(svhn_hist['loss'])
plt.plot(svhn_hist['val_loss'])
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()

# Plotting Accuracy at different epochs
plt.title('Training Accuracy vs Validation Accuracy',fontsize=15,color="green")
plt.plot(svhn_hist['accuracy'])
plt.plot(svhn_hist['val_accuracy'])
plt.ylabel('accuracy')
plt.xlabel('Epoch')
plt.legend(("training" , "validation") , loc ='best')
plt.show()
In [67]:
# calculate score of training data
svhn_model.evaluate(X_svhn_train, y_svhn_train, batch_size=100, verbose=1)
420/420 [==============================] - 1s 3ms/step - loss: 0.5871 - accuracy: 0.8202
Out[67]:
[0.5870670676231384, 0.8201666474342346]
In [68]:
# calculate score of testing data
svhn_model.evaluate(X_svhn_test, y_svhn_test_cat, batch_size=100, verbose=1)
180/180 [==============================] - 0s 3ms/step - loss: 0.7751 - accuracy: 0.7642
Out[68]:
[0.7750727534294128, 0.7642222046852112]
In [69]:
# Predicting for X_test
y_svhn_pred=svhn_model.predict(X_svhn_test)
y_svhn_pred
563/563 [==============================] - 1s 2ms/step
Out[69]:
array([[3.4577098e-01, 1.6166454e-02, 3.1618235e-01, ..., 9.2613786e-02,
        6.2088434e-02, 1.2856001e-01],
       [4.1881553e-04, 8.6624026e-03, 4.6452436e-01, ..., 5.0947154e-01,
        8.3934190e-04, 5.9603684e-04],
       [1.2797548e-04, 5.8346872e-05, 9.9713898e-01, ..., 1.3466383e-03,
        6.6302385e-04, 7.9395650e-05],
       ...,
       [1.3367975e-03, 5.4388600e-03, 1.0670007e-03, ..., 9.9128717e-01,
        2.4241621e-05, 1.4755127e-04],
       [1.7010840e-02, 9.5398095e-04, 8.0615020e-04, ..., 5.0044339e-04,
        5.5240942e-03, 9.6345818e-01],
       [6.2140054e-04, 1.1670088e-03, 9.7285199e-01, ..., 5.0526974e-03,
        1.5521442e-03, 1.2643705e-03]], dtype=float32)
In [70]:
y_svhn_pred_final=[]
for i in y_svhn_pred:
  y_svhn_pred_final.append(np.argmax(i))
print(y_svhn_pred_final)
[0, 7, 2, 9, 0, 9, 1, 5, 1, 4, 8, 3, 4, 4, 5, 5, 8, 6, 4, 5, 0, 6, 5, 8, 2, 3, 0, 2, 9, 5, 2, 8, 9, 1, 0, 9, 5, 3, 3, 7, 0, 4, 2, 4, 9, 4, 2, 8, 8, 3, 5, 3, 7, 1, 4, 8, 4, 1, 2, 9, 0, 1, 5, 9, 9, 2, 2, 1, 8, 8, 9, 8, 3, 8, 4, 5, 2, 8, 6, 5, 5, 4, 2, 8, 2, 4, 0, 9, 9, 5, 6, 2, 0, 1, 0, 7, 6, 4, 8, 7, 7, 7, 3, 2, 1, 4, 9, 6, 1, 4, 1, 0, 9, 0, 8, 4, 4, 1, 0, 9, 6, 3, 9, 0, 5, 0, 2, 5, 6, 1, 6, 6, 6, 9, 4, 9, 8, 8, 6, 4, 7, 2, 3, 5, 5, 0, 0, 0, 9, 8, 3, 8, 8, 9, 4, 4, 8, 4, 7, 7, 0, 6, 2, 8, 9, 2, 7, 9, 7, 1, 5, 2, 9, 0, 4, 5, 1, 1, 5, 5, 3, 2, 9, 0, 1, 9, 0, 3, 8, 9, 6, 8, 4, 9, 3, 2, 7, 8, 6, 3, 3, 5, 2, 9, 0, 2, 1, 8, 2, 8, 9, 5, 2, 0, 2, 9, 0, 2, 0, 9, 5, 1, 1, 4, 8, 9, 6, 0, 9, 3, 3, 8, 8, 3, 0, 8, 6, 7, 7, 3, 8, 7, 7, 3, 9, 0, 8, 4, 1, 3, 3, 1, 0, 1, 5, 7, 0, 0, 8, 2, 4, 6, 4, 9, 7, 7, 9, 1, 6, 2, 9, 4, 5, 0, 0, 7, 7, 0, 0, 9, 6, 3, 7, 7, 8, 6, 3, 2, 5, 2, 5, 4, 3, 0, 9, 1, 4, 5, 5, 5, 9, 7, 7, 3, 5, 0, 8, 3, 1, 4, 8, 6, 0, 3, 3, 2, 6, 7, 0, 1, 0, 6, 5, 4, 2, 1, 0, 7, 7, 0, 6, 3, 8, 2, 2, 6, 8, 7, 4, 0, 7, 7, 8, 7, 0, 5, 1, 2, 8, 8, 4, 2, 7, 3, 7, 2, 3, 0, 2, 9, 3, 1, 2, 9, 5, 3, 9, 1, 7, 3, 8, 4, 4, 3, 6, 3, 8, 5, 1, 1, 3, 7, 8, 8, 8, 5, 9, 7, 3, 2, 8, 0, 0, 8, 9, 6, 3, 7, 9, 4, 6, 5, 1, 2, 2, 4, 3, 1, 2, 9, 4, 1, 5, 9, 0, 3, 1, 5, 3, 9, 3, 5, 9, 8, 4, 7, 0, 0, 9, 6, 5, 9, 0, 4, 9, 4, 7, 4, 6, 5, 5, 3, 5, 5, 0, 3, 8, 3, 7, 0, 5, 4, 0, 5, 0, 0, 9, 0, 4, 5, 8, 0, 7, 7, 8, 6, 5, 7, 6, 1, 8, 9, 3, 2, 3, 9, 4, 9, 5, 3, 7, 6, 2, 7, 1, 9, 0, 9, 7, 6, 5, 0, 2, 1, 6, 5, 1, 7, 8, 0, 5, 6, 4, 1, 6, 8, 5, 3, 1, 5, 2, 4, 6, 6, 7, 8, 3, 8, 8, 5, 2, 0, 8, 3, 8, 9, 4, 0, 3, 4, 2, 9, 6, 9, 0, 0, 7, 5, 1, 0, 7, 7, 9, 1, 2, 0, 8, 8, 3, 3, 1, 0, 8, 3, 3, 1, 0, 9, 6, 7, 0, 4, 9, 9, 7, 0, 7, 8, 3, 7, 8, 8, 0, 8, 0, 4, 5, 9, 3, 8, 6, 9, 7, 8, 0, 7, 5, 2, 8, 7, 6, 5, 3, 4, 1, 6, 4, 8, 6, 9, 5, 8, 4, 6, 1, 5, 6, 6, 3, 6, 1, 2, 8, 0, 9, 0, 6, 0, 9, 6, 4, 7, 7, 1, 9, 4, 4, 9, 7, 7, 4, 5, 6, 5, 4, 7, 4, 8, 9, 9, 8, 7, 3, 7, 6, 2, 8, 8, 2, 6, 9, 6, 0, 5, 4, 3, 7, 7, 7, 4, 8, 0, 1, 2, 5, 0, 1, 3, 3, 5, 5, 7, 2, 4, 0, 1, 2, 1, 6, 0, 4, 4, 9, 6, 9, 1, 7, 8, 6, 5, 7, 8, 8, 2, 8, 0, 8, 1, 6, 2, 3, 6, 6, 6, 2, 5, 3, 8, 6, 2, 3, 7, 1, 0, 9, 6, 7, 4, 5, 1, 9, 8, 8, 0, 0, 4, 8, 1, 4, 6, 0, 1, 5, 5, 4, 2, 5, 7, 1, 7, 1, 8, 7, 7, 4, 2, 0, 0, 0, 1, 2, 1, 0, 4, 3, 0, 0, 1, 2, 3, 8, 2, 9, 9, 4, 5, 2, 1, 7, 0, 1, 0, 8, 6, 1, 5, 7, 3, 3, 2, 7, 7, 1, 9, 9, 8, 1, 3, 2, 2, 8, 7, 1, 8, 8, 3, 7, 2, 9, 3, 9, 5, 7, 1, 2, 4, 3, 8, 6, 4, 1, 8, 9, 5, 6, 0, 8, 0, 3, 7, 1, 0, 7, 7, 7, 0, 6, 4, 1, 4, 2, 7, 1, 2, 6, 6, 3, 7, 4, 6, 5, 4, 8, 0, 4, 3, 0, 2, 0, 2, 2, 8, 7, 4, 9, 6, 2, 3, 7, 9, 0, 9, 8, 8, 7, 6, 4, 2, 9, 0, 6, 3, 7, 6, 4, 0, 5, 3, 1, 6, 9, 8, 9, 9, 3, 1, 0, 5, 7, 5, 0, 8, 2, 1, 9, 7, 3, 5, 2, 4, 0, 0, 4, 1, 1, 3, 7, 1, 5, 9, 8, 8, 2, 8, 3, 9, 7, 4, 3, 4, 4, 7, 0, 9, 6, 6, 8, 3, 3, 2, 6, 2, 1, 0, 5, 1, 0, 1, 0, 2, 1, 6, 3, 7, 2, 6, 8, 8, 1, 3, 4, 8, 7, 3, 5, 6, 7, 0, 0, 5, 5, 4, 8, 0, 8, 0, 6, 8, 0, 3, 3, 2, 9, 2, 6, 7, 7, 0, 3, 5, 0, 4, 4, 7, 3, 5, 7, 4, 6, 9, 9, 9, 1, 1, 5, 2, 7, 1, 9, 1, 7, 2, 0, 2, 2, 7, 5, 2, 5, 2, 2, 2, 2, 0, 5, 3, 8, 6, 7, 1, 8, 5, 2, 2, 3, 8, 2, 6, 7, 2, 0, 0, 0, 4, 0, 4, 6, 8, 1, 0, 5, 8, 0, 8, 7, 3, 8, 8, 6, 2, 1, 6, 5, 2, 3, 0, 3, 6, 7, 5, 8, 9, 5, 1, 0, 8, 3, 6, 9, 9, 8, 9, 8, 8, 3, 0, 0, 9, 1, 8, 0, 7, 3, 9, 7, 5, 7, 3, 2, 6, 9, 9, 3, 2, 5, 5, 7, 6, 3, 7, 6, 1, 0, 5, 1, 4, 8, 4, 1, 6, 6, 3, 6, 1, 2, 7, 1, 8, 8, 7, 0, 7, 4, 0, 3, 7, 7, 7, 9, 6, 5, 8, 6, 7, 4, 9, 5, 7, 8, 5, 8, 9, 5, 3, 8, 7, 3, 2, 6, 7, 9, 5, 7, 0, 3, 9, 6, 5, 5, 5, 2, 8, 0, 4, 4, 0, 2, 1, 9, 2, 0, 0, 2, 4, 3, 7, 9, 5, 3, 3, 5, 9, 5, 9, 4, 9, 1, 2, 4, 3, 9, 7, 0, 7, 8, 5, 7, 1, 6, 4, 7, 5, 2, 2, 3, 6, 8, 3, 4, 8, 0, 5, 3, 5, 7, 2, 7, 8, 9, 4, 2, 6, 6, 8, 7, 7, 2, 0, 2, 3, 6, 4, 5, 0, 4, 8, 1, 5, 6, 6, 0, 3, 8, 1, 7, 3, 4, 9, 0, 9, 9, 1, 1, 5, 8, 1, 5, 5, 5, 5, 6, 0, 6, 4, 4, 7, 1, 7, 7, 8, 8, 5, 9, 0, 3, 1, 1, 7, 1, 9, 5, 8, 7, 0, 5, 1, 6, 6, 2, 3, 2, 4, 3, 5, 3, 3, 1, 9, 4, 1, 4, 4, 8, 4, 0, 1, 1, 5, 1, 4, 2, 8, 6, 0, 9, 6, 9, 8, 8, 2, 5, 9, 4, 3, 7, 0, 0, 4, 4, 4, 8, 1, 3, 1, 4, 2, 4, 3, 4, 8, 8, 7, 3, 6, 2, 7, 9, 2, 3, 3, 8, 9, 9, 0, 0, 3, 9, 0, 8, 7, 3, 1, 2, 3, 9, 6, 3, 4, 5, 3, 1, 4, 5, 6, 6, 3, 8, 5, 1, 5, 2, 8, 4, 6, 9, 3, 4, 0, 0, 0, 0, 1, 2, 7, 8, 4, 5, 3, 6, 1, 7, 7, 6, 3, 3, 6, 0, 6, 5, 8, 2, 2, 3, 6, 3, 4, 7, 5, 2, 0, 0, 0, 9, 0, 2, 9, 7, 6, 9, 2, 2, 4, 1, 9, 7, 4, 8, 0, 8, 0, 5, 2, 3, 3, 7, 7, 2, 9, 7, 2, 6, 8, 2, 1, 7, 5, 6, 8, 3, 9, 3, 3, 4, 1, 0, 6, 6, 5, 0, 6, 5, 5, 0, 9, 3, 7, 6, 2, 7, 0, 1, 8, 7, 5, 4, 1, 8, 6, 6, 6, 0, 0, 6, 8, 2, 5, 5, 6, 6, 6, 2, 4, 1, 5, 6, 9, 1, 9, 4, 0, 9, 5, 4, 4, 9, 9, 3, 7, 9, 1, 2, 0, 6, 3, 5, 5, 3, 1, 3, 1, 2, 3, 7, 2, 6, 9, 6, 4, 1, 1, 0, 1, 9, 6, 9, 8, 5, 8, 9, 0, 7, 9, 2, 4, 0, 4, 4, 3, 7, 5, 2, 0, 2, 4, 4, 3, 5, 0, 5, 2, 1, 8, 9, 3, 7, 4, 8, 5, 0, 8, 8, 4, 1, 8, 2, 8, 3, 6, 0, 6, 2, 8, 7, 8, 0, 8, 8, 3, 2, 1, 1, 6, 1, 4, 9, 4, 7, 5, 0, 3, 0, 8, 3, 4, 0, 7, 0, 2, 0, 3, 3, 0, 4, 5, 1, 3, 6, 7, 7, 5, 6, 1, 6, 9, 4, 8, 0, 6, 3, 9, 0, 5, 1, 7, 4, 2, 3, 7, 2, 7, 7, 0, 4, 9, 9, 1, 8, 7, 2, 1, 2, 0, 2, 1, 7, 4, 7, 0, 1, 3, 4, 4, 7, 8, 0, 1, 6, 1, 6, 9, 6, 4, 9, 3, 9, 2, 4, 7, 6, 7, 3, 2, 7, 7, 4, 4, 8, 4, 3, 4, 0, 2, 4, 7, 7, 3, 3, 8, 3, 2, 0, 0, 6, 8, 8, 8, 0, 1, 7, 9, 4, 1, 1, 1, 5, 5, 1, 7, 8, 0, 6, 2, 6, 0, 1, 9, 3, 4, 1, 9, 5, 5, 5, 6, 3, 3, 3, 4, 9, 1, 2, 7, 6, 3, 9, 6, 9, 2, 5, 7, 0, 2, 4, 8, 7, 2, 4, 7, 6, 7, 6, 4, 7, 5, 2, 9, 5, 1, 1, 0, 6, 2, 5, 6, 6, 4, 2, 2, 1, 9, 9, 6, 5, 5, 6, 5, 0, 6, 5, 8, 0, 4, 3, 3, 8, 4, 1, 1, 8, 3, 2, 7, 4, 4, 2, 1, 1, 7, 4, 5, 0, 4, 5, 0, 8, 0, 3, 9, 5, 1, 7, 8, 1, 7, 5, 5, 1, 4, 6, 0, 8, 4, 4, 6, 3, 3, 4, 8, 3, 4, 4, 0, 4, 3, 5, 2, 8, 1, 5, 8, 0, 0, 7, 2, 7, 5, 6, 2, 7, 1, 1, 6, 6, 5, 5, 8, 2, 1, 3, 8, 6, 8, 3, 4, 1, 2, 2, 5, 0, 1, 0, 1, 6, 2, 5, 4, 6, 5, 7, 0, 8, 2, 8, 1, 4, 0, 5, 3, 1, 2, 5, 0, 1, 9, 7, 2, 6, 1, 7, 2, 9, 0, 5, 0, 2, 4, 9, 7, 1, 5, 7, 8, 4, 4, 1, 0, 8, 0, 8, 2, 5, 7, 3, 2, 7, 7, 1, 1, 5, 4, 9, 4, 2, 0, 8, 0, 4, 9, 9, 4, 5, 6, 4, 6, 4, 4, 8, 9, 5, 0, 1, 9, 4, 5, 4, 1, 1, 1, 3, 2, 7, 6, 5, 3, 8, 9, 7, 0, 4, 8, 5, 4, 9, 8, 9, 2, 0, 3, 5, 4, 5, 4, 6, 8, 7, 9, 9, 4, 8, 0, 0, 8, 6, 3, 9, 3, 9, 9, 5, 5, 5, 3, 1, 7, 1, 4, 6, 1, 4, 6, 7, 4, 5, 5, 8, 3, 3, 3, 4, 2, 3, 3, 8, 3, 4, 1, 1, 3, 6, 6, 1, 9, 5, 2, 2, 2, 7, 2, 5, 7, 5, 4, 7, 0, 1, 2, 5, 4, 1, 1, 7, 9, 6, 6, 9, 1, 6, 1, 5, 0, 2, 6, 0, 5, 4, 1, 8, 6, 3, 5, 1, 0, 9, 7, 4, 4, 3, 1, 1, 9, 5, 5, 4, 8, 0, 6, 8, 9, 6, 6, 5, 3, 9, 1, 9, 3, 9, 0, 6, 7, 3, 0, 2, 2, 0, 7, 2, 6, 4, 0, 4, 2, 0, 7, 5, 0, 1, 4, 2, 9, 4, 6, 1, 7, 2, 7, 3, 4, 6, 9, 0, 6, 7, 1, 3, 9, 2, 4, 8, 8, 0, 2, 5, 3, 2, 7, 3, 4, 1, 4, 5, 6, 0, 5, 5, 0, 2, 3, 3, 6, 3, 8, 0, 7, 5, 6, 2, 3, 5, 6, 9, 8, 5, 0, 0, 0, 0, 0, 9, 1, 4, 1, 2, 4, 4, 8, 5, 5, 1, 3, 0, 6, 4, 8, 2, 0, 2, 0, 7, 1, 0, 6, 8, 7, 3, 4, 2, 3, 7, 9, 8, 3, 6, 0, 1, 1, 6, 2, 6, 7, 6, 0, 0, 0, 6, 3, 2, 9, 4, 4, 4, 6, 2, 4, 2, 7, 5, 0, 6, 6, 6, 9, 6, 9, 5, 8, 1, 5, 7, 8, 8, 9, 1, 6, 1, 9, 1, 0, 4, 4, 9, 5, 9, 9, 5, 7, 4, 6, 4, 1, 7, 3, 2, 6, 5, 3, 4, 2, 0, 6, 9, 0, 1, 1, 5, 7, 7, 5, 8, 0, 5, 2, 2, 4, 0, 6, 1, 8, 2, 9, 2, 7, 9, 5, 5, 9, 7, 3, 2, 1, 3, 2, 2, 6, 0, 2, 3, 9, 1, 2, 1, 4, 7, 1, 4, 7, 2, 5, 7, 6, 4, 4, 1, 5, 1, 6, 5, 2, 7, 0, 7, 1, 1, 4, 9, 4, 1, 1, 2, 0, 0, 3, 9, 0, 1, 3, 4, 1, 6, 3, 1, 1, 5, 9, 2, 1, 2, 6, 2, 7, 4, 6, 4, 0, 4, 9, 4, 4, 0, 5, 8, 4, 8, 3, 6, 7, 1, 3, 3, 9, 0, 8, 7, 5, 2, 1, 2, 2, 7, 8, 1, 9, 7, 7, 6, 7, 7, 4, 6, 5, 9, 5, 5, 9, 1, 2, 2, 4, 1, 8, 3, 3, 8, 1, 9, 1, 6, 9, 8, 3, 8, 7, 5, 2, 6, 5, 8, 0, 5, 5, 5, 0, 9, 9, 5, 0, 5, 9, 9, 1, 4, 5, 9, 4, 8, 4, 3, 9, 9, 5, 8, 1, 1, 2, 5, 2, 7, 2, 8, 1, 7, 6, 0, 6, 2, 6, 7, 8, 1, 1, 9, 5, 0, 6, 6, 8, 8, 9, 3, 1, 8, 8, 6, 2, 4, 1, 4, 4, 5, 5, 3, 6, 0, 8, 7, 0, 6, 6, 0, 5, 7, 8, 1, 6, 7, 8, 6, 2, 7, 3, 5, 2, 9, 2, 9, 4, 7, 0, 8, 9, 6, 7, 1, 3, 3, 8, 4, 6, 6, 1, 1, 7, 5, 4, 7, 3, 3, 1, 0, 4, 8, 2, 6, 8, 2, 0, 9, 0, 6, 3, 8, 8, 3, 0, 9, 9, 0, 8, 4, 7, 8, 3, 3, 9, 8, 6, 5, 0, 0, 2, 0, 7, 9, 8, 1, 8, 8, 4, 1, 0, 0, 3, 9, 0, 5, 3, 0, 9, 2, 2, 2, 9, 2, 3, 5, 4, 0, 4, 1, 0, 1, 3, 7, 6, 2, 2, 8, 9, 4, 5, 1, 3, 6, 7, 4, 2, 8, 8, 5, 8, 3, 0, 1, 5, 5, 4, 4, 7, 1, 0, 1, 1, 1, 1, 4, 4, 4, 2, 0, 5, 7, 5, 7, 5, 2, 6, 7, 6, 0, 9, 3, 5, 0, 4, 4, 9, 1, 8, 1, 8, 3, 3, 1, 6, 6, 7, 3, 3, 8, 0, 7, 0, 7, 1, 3, 4, 1, 7, 8, 5, 1, 8, 3, 4, 4, 3, 8, 7, 0, 1, 5, 4, 5, 9, 8, 2, 7, 2, 6, 0, 7, 1, 6, 7, 2, 2, 4, 2, 4, 3, 3, 2, 0, 3, 0, 0, 8, 0, 8, 0, 6, 7, 8, 2, 1, 6, 0, 5, 1, 8, 3, 8, 5, 2, 2, 2, 4, 0, 9, 7, 6, 6, 4, 7, 7, 2, 2, 0, 5, 5, 4, 0, 6, 4, 2, 6, 7, 7, 2, 7, 2, 6, 0, 4, 6, 2, 6, 4, 5, 8, 0, 5, 2, 1, 0, 8, 3, 4, 3, 1, 3, 4, 5, 3, 2, 8, 5, 3, 0, 0, 3, 9, 3, 0, 6, 2, 1, 2, 5, 9, 8, 5, 1, 3, 9, 1, 9, 2, 0, 8, 8, 1, 7, 7, 8, 2, 9, 4, 0, 0, 3, 8, 2, 7, 9, 9, 9, 2, 7, 8, 4, 6, 7, 6, 8, 2, 6, 2, 8, 8, 1, 5, 2, 7, 3, 7, 6, 6, 6, 4, 8, 0, 0, 8, 7, 1, 9, 6, 3, 9, 0, 8, 4, 8, 2, 0, 0, 6, 4, 2, 0, 2, 7, 5, 3, 6, 4, 5, 5, 6, 0, 2, 0, 6, 2, 1, 9, 4, 4, 1, 9, 1, 2, 3, 0, 6, 9, 1, 3, 8, 4, 8, 0, 2, 7, 9, 5, 1, 5, 2, 4, 3, 9, 9, 9, 5, 8, 1, 7, 7, 1, 5, 6, 2, 4, 6, 6, 1, 2, 7, 7, 0, 1, 9, 6, 7, 2, 1, 4, 8, 1, 9, 0, 0, 0, 7, 3, 1, 4, 3, 8, 2, 1, 8, 8, 5, 3, 5, 3, 9, 5, 6, 8, 4, 4, 1, 9, 5, 1, 3, 3, 3, 6, 7, 7, 7, 9, 5, 5, 3, 7, 3, 1, 5, 2, 0, 2, 3, 3, 0, 3, 8, 9, 6, 5, 5, 9, 5, 1, 7, 1, 7, 9, 8, 0, 0, 5, 4, 9, 2, 2, 3, 2, 0, 9, 0, 4, 3, 6, 2, 2, 4, 4, 9, 1, 8, 9, 5, 7, 2, 7, 0, 2, 9, 6, 8, 4, 8, 0, 4, 0, 1, 2, 9, 7, 2, 2, 7, 3, 9, 6, 9, 8, 0, 1, 1, 2, 5, 0, 9, 3, 1, 7, 1, 5, 6, 7, 8, 8, 1, 1, 5, 2, 3, 3, 9, 9, 5, 7, 2, 8, 4, 5, 2, 3, 2, 0, 2, 6, 8, 3, 3, 9, 6, 0, 8, 4, 2, 6, 0, 3, 3, 1, 2, 3, 5, 0, 9, 1, 9, 1, 6, 2, 3, 3, 9, 2, 0, 3, 7, 4, 3, 6, 4, 5, 1, 1, 6, 3, 5, 4, 9, 2, 2, 2, 3, 2, 4, 3, 0, 4, 4, 4, 5, 9, 1, 1, 8, 7, 5, 6, 3, 4, 7, 1, 3, 8, 0, 7, 9, 1, 5, 6, 3, 6, 7, 1, 8, 7, 4, 1, 8, 0, 4, 1, 8, 0, 7, 7, 2, 0, 6, 8, 7, 2, 2, 1, 3, 1, 6, 4, 7, 9, 0, 9, 1, 8, 8, 6, 1, 9, 4, 2, 5, 8, 4, 2, 5, 6, 1, 3, 2, 3, 3, 6, 4, 1, 4, 1, 5, 5, 8, 4, 8, 1, 7, 2, 0, 9, 6, 3, 2, 3, 6, 4, 1, 6, 2, 2, 5, 3, 5, 1, 3, 4, 2, 3, 6, 9, 1, 2, 0, 7, 1, 7, 5, 3, 6, 1, 4, 3, 3, 9, 8, 7, 2, 7, 4, 4, 2, 2, 8, 6, 7, 5, 8, 2, 1, 6, 4, 4, 6, 6, 2, 1, 6, 2, 3, 2, 8, 0, 4, 9, 3, 4, 7, 3, 1, 2, 7, 7, 8, 8, 7, 9, 6, 2, 3, 3, 9, 1, 6, 8, 8, 6, 6, 6, 2, 6, 4, 9, 7, 6, 9, 8, 6, 8, 0, 0, 4, 5, 5, 5, 4, 3, 4, 3, 1, 7, 0, 4, 9, 2, 2, 9, 1, 5, 0, 8, 0, 4, 9, 4, 0, 8, 9, 0, 7, 4, 7, 2, 5, 1, 9, 9, 6, 9, 9, 8, 8, 1, 9, 7, 0, 1, 4, 9, 0, 1, 0, 2, 5, 0, 3, 0, 8, 5, 5, 4, 6, 8, 2, 3, 4, 2, 8, 2, 0, 0, 3, 9, 0, 8, 7, 5, 8, 3, 3, 3, 1, 5, 8, 5, 2, 4, 4, 2, 1, 0, 4, 0, 6, 3, 2, 3, 2, 7, 4, 8, 8, 6, 3, 5, 3, 5, 0, 8, 0, 1, 9, 4, 7, 2, 4, 0, 0, 8, 7, 1, 3, 9, 8, 4, 4, 1, 2, 4, 6, 2, 4, 1, 4, 0, 6, 8, 8, 2, 9, 2, 6, 7, 6, 5, 4, 9, 0, 6, 9, 1, 9, 0, 1, 9, 7, 8, 5, 7, 9, 4, 5, 1, 1, 4, 0, 0, 1, 1, 5, 0, 8, 9, 8, 2, 5, 0, 8, 7, 0, 0, 4, 4, 3, 9, 7, 1, 6, 5, 3, 1, 4, 2, 0, 2, 5, 9, 4, 6, 3, 9, 4, 2, 5, 6, 5, 7, 4, 8, 4, 4, 6, 1, 3, 0, 8, 3, 3, 8, 0, 3, 6, 9, 2, 6, 1, 7, 4, 0, 1, 1, 6, 7, 8, 8, 6, 4, 2, 8, 8, 3, 7, 3, 6, 8, 5, 1, 5, 0, 9, 1, 9, 1, 9, 9, 6, 5, 6, 1, 7, 0, 0, 6, 1, 2, 0, 6, 9, 9, 7, 2, 9, 3, 5, 2, 9, 4, 7, 9, 7, 6, 2, 3, 4, 8, 9, 8, 9, 1, 4, 4, 2, 9, 4, 5, 7, 4, 8, 0, 8, 2, 5, 2, 1, 1, 2, 1, 5, 7, 9, 3, 9, 6, 2, 3, 9, 3, 6, 5, 4, 4, 4, 6, 2, 8, 7, 0, 1, 2, 6, 5, 8, 5, 0, 6, 0, 8, 3, 7, 3, 3, 0, 2, 8, 9, 4, 5, 3, 9, 1, 4, 4, 4, 7, 6, 1, 9, 9, 8, 1, 1, 0, 9, 0, 3, 4, 0, 9, 9, 2, 7, 9, 4, 3, 8, 5, 5, 4, 9, 0, 1, 5, 8, 1, 2, 7, 1, 1, 8, 2, 7, 6, 1, 9, 1, 1, 8, 1, 5, 1, 8, 5, 2, 9, 6, 3, 1, 9, 0, 6, 0, 2, 6, 7, 1, 9, 3, 8, 5, 3, 5, 0, 7, 0, 5, 5, 0, 2, 8, 9, 1, 3, 9, 2, 6, 0, 6, 9, 3, 3, 9, 4, 5, 6, 0, 0, 4, 5, 6, 5, 1, 8, 5, 3, 7, 0, 1, 1, 0, 8, 7, 3, 4, 1, 8, 9, 1, 3, 5, 2, 5, 8, 3, 9, 7, 5, 5, 3, 5, 6, 6, 2, 4, 0, 5, 5, 3, 6, 0, 3, 4, 8, 4, 8, 3, 3, 7, 3, 1, 8, 4, 2, 2, 0, 1, 7, 2, 1, 4, 3, 2, 3, 5, 6, 9, 1, 5, 9, 1, 4, 6, 4, 0, 6, 3, 8, 6, 8, 5, 1, 3, 7, 0, 5, 3, 1, 4, 2, 2, 3, 2, 8, 0, 6, 1, 2, 8, 0, 2, 9, 1, 3, 2, 6, 7, 8, 7, 6, 8, 6, 1, 7, 6, 2, 0, 1, 0, 5, 6, 6, 8, 6, 4, 3, 6, 2, 5, 4, 3, 4, 5, 0, 8, 6, 9, 0, 9, 2, 9, 6, 6, 5, 7, 2, 4, 3, 9, 6, 4, 7, 3, 8, 6, 2, 0, 9, 2, 9, 7, 0, 6, 3, 2, 6, 9, 2, 1, 8, 2, 4, 4, 8, 1, 0, 5, 5, 6, 2, 1, 6, 1, 8, 5, 1, 3, 2, 8, 6, 0, 5, 8, 6, 5, 4, 2, 0, 6, 8, 7, 6, 5, 7, 0, 3, 1, 1, 5, 0, 6, 0, 8, 1, 6, 7, 4, 8, 4, 1, 6, 9, 8, 7, 4, 1, 7, 8, 2, 2, 7, 8, 1, 6, 9, 7, 7, 2, 3, 3, 1, 0, 1, 5, 1, 1, 5, 2, 1, 9, 8, 8, 1, 1, 5, 3, 9, 1, 5, 2, 9, 4, 9, 1, 9, 1, 7, 5, 8, 3, 0, 8, 8, 9, 8, 5, 1, 7, 9, 3, 2, 9, 2, 8, 4, 0, 8, 6, 4, 0, 9, 0, 6, 7, 9, 0, 3, 6, 8, 1, 7, 7, 9, 1, 1, 6, 1, 1, 6, 3, 5, 3, 9, 5, 0, 1, 2, 8, 4, 1, 8, 7, 9, 9, 3, 5, 7, 4, 4, 5, 2, 8, 8, 2, 4, 6, 5, 2, 2, 2, 9, 0, 4, 6, 2, 2, 6, 5, 2, 2, 8, 8, 8, 7, 7, 9, 0, 9, 1, 8, 8, 9, 5, 2, 0, 2, 7, 0, 8, 3, 4, 1, 0, 4, 7, 7, 1, 4, 1, 7, 3, 5, 1, 7, 1, 1, 8, 9, 1, 8, 2, 5, 0, 7, 7, 9, 7, 6, 2, 0, 7, 2, 6, 5, 6, 4, 3, 3, 1, 4, 8, 9, 3, 5, 4, 3, 5, 6, 1, 6, 0, 5, 1, 2, 0, 0, 1, 3, 9, 0, 7, 7, 2, 4, 2, 5, 1, 8, 7, 9, 5, 6, 5, 8, 6, 4, 0, 9, 1, 0, 6, 2, 2, 0, 0, 7, 4, 6, 2, 3, 7, 1, 7, 8, 3, 6, 5, 3, 9, 4, 5, 3, 9, 9, 0, 7, 2, 9, 9, 3, 2, 8, 8, 9, 6, 7, 2, 3, 4, 4, 4, 9, 6, 5, 8, 8, 9, 7, 1, 1, 7, 0, 2, 9, 6, 2, 8, 0, 5, 6, 5, 7, 3, 5, 2, 4, 6, 4, 6, 3, 0, 8, 9, 6, 0, 7, 0, 1, 1, 8, 7, 4, 9, 0, 8, 1, 1, 0, 8, 8, 5, 0, 5, 5, 0, 5, 0, 8, 1, 8, 2, 9, 1, 6, 3, 2, 4, 0, 1, 2, 4, 1, 1, 4, 4, 6, 2, 2, 5, 7, 0, 6, 6, 1, 8, 2, 4, 8, 8, 4, 2, 6, 8, 9, 8, 6, 5, 4, 8, 8, 7, 1, 6, 2, 5, 6, 4, 4, 5, 6, 3, 7, 4, 3, 8, 4, 2, 1, 6, 2, 9, 6, 1, 1, 8, 1, 8, 4, 8, 8, 7, 8, 7, 6, 3, 9, 7, 7, 4, 9, 9, 5, 2, 1, 4, 4, 1, 4, 8, 7, 4, 1, 6, 4, 8, 7, 6, 2, 0, 8, 6, 9, 7, 1, 3, 2, 0, 1, 6, 5, 5, 4, 1, 4, 6, 8, 6, 3, 7, 9, 1, 8, 9, 8, 1, 6, 5, 2, 1, 7, 5, 8, 4, 9, 1, 5, 9, 6, 6, 4, 2, 8, 9, 4, 8, 1, 6, 2, 1, 1, 6, 1, 2, 1, 5, 1, 6, 8, 3, 9, 7, 3, 0, 3, 1, 2, 8, 7, 8, 1, 0, 2, 4, 7, 3, 6, 7, 6, 3, 6, 2, 7, 4, 9, 9, 3, 6, 8, 9, 4, 0, 9, 1, 6, 6, 4, 8, 6, 2, 0, 3, 4, 2, 7, 3, 1, 9, 9, 4, 2, 3, 8, 4, 9, 6, 8, 5, 2, 1, 1, 9, 1, 9, 2, 4, 1, 8, 6, 7, 7, 4, 0, 4, 5, 5, 4, 5, 3, 2, 1, 3, 5, 3, 7, 0, 3, 0, 7, 4, 6, 3, 1, 7, 3, 4, 6, 1, 1, 4, 1, 3, 4, 3, 5, 8, 2, 6, 5, 6, 9, 2, 6, 1, 6, 6, 4, 1, 0, 5, 9, 0, 7, 6, 1, 8, 6, 7, 1, 3, 9, 3, 1, 3, 9, 7, 4, 2, 7, 5, 1, 0, 5, 7, 5, 8, 5, 8, 8, 0, 0, 5, 3, 0, 3, 0, 4, 6, 8, 0, 2, 9, 8, 3, 9, 7, 6, 1, 6, 8, 2, 4, 8, 6, 1, 0, 3, 2, 9, 2, 4, 0, 3, 3, 3, 6, 3, 4, 2, 5, 0, 9, 9, 2, 0, 6, 4, 9, 8, 9, 8, 7, 3, 0, 1, 6, 5, 2, 6, 2, 6, 7, 8, 5, 5, 3, 3, 7, 0, 8, 9, 3, 3, 2, 4, 1, 0, 7, 1, 4, 4, 4, 0, 2, 6, 7, 8, 5, 2, 9, 7, 6, 9, 4, 8, 8, 3, 9, 7, 6, 2, 3, 9, 5, 5, 8, 6, 1, 6, 2, 0, 9, 5, 8, 2, 6, 8, 5, 9, 2, 8, 7, 5, 5, 9, 4, 6, 7, 8, 5, 8, 3, 4, 4, 3, 0, 2, 8, 9, 4, 1, 2, 4, 2, 7, 1, 3, 8, 4, 3, 7, 5, 4, 2, 7, 1, 8, 5, 8, 0, 9, 2, 4, 5, 5, 3, 3, 9, 8, 1, 3, 8, 7, 0, 8, 7, 0, 1, 0, 2, 6, 8, 8, 6, 6, 1, 3, 7, 5, 0, 1, 7, 6, 5, 9, 4, 5, 2, 9, 9, 2, 6, 9, 1, 7, 9, 7, 5, 4, 4, 0, 9, 4, 2, 8, 2, 9, 8, 2, 9, 3, 2, 3, 6, 4, 6, 0, 7, 0, 7, 4, 7, 4, 6, 1, 7, 0, 8, 2, 4, 0, 3, 0, 8, 2, 0, 3, 0, 3, 3, 7, 4, 7, 8, 6, 4, 7, 8, 3, 6, 2, 9, 7, 5, 6, 4, 5, 6, 0, 7, 1, 2, 4, 4, 3, 8, 0, 1, 0, 0, 1, 2, 6, 8, 0, 4, 9, 4, 4, 4, 8, 8, 8, 3, 0, 1, 7, 9, 8, 0, 8, 5, 4, 0, 7, 6, 1, 7, 8, 4, 2, 0, 7, 0, 2, 1, 4, 1, 6, 3, 3, 3, 1, 9, 5, 1, 3, 1, 5, 7, 0, 0, 6, 3, 8, 9, 9, 1, 2, 6, 7, 6, 6, 5, 9, 9, 8, 9, 3, 4, 8, 6, 4, 5, 0, 1, 1, 2, 2, 0, 5, 7, 0, 2, 7, 3, 6, 8, 7, 6, 2, 6, 0, 1, 8, 3, 3, 4, 1, 4, 1, 2, 2, 3, 7, 3, 2, 0, 5, 5, 9, 2, 9, 6, 0, 5, 5, 6, 8, 2, 3, 0, 6, 8, 8, 3, 6, 7, 0, 0, 5, 1, 4, 9, 0, 0, 4, 3, 4, 4, 8, 7, 8, 2, 9, 7, 0, 2, 8, 0, 1, 1, 4, 5, 2, 2, 3, 7, 3, 2, 3, 8, 4, 7, 8, 7, 9, 9, 0, 6, 9, 1, 2, 1, 9, 9, 6, 7, 5, 9, 7, 9, 8, 2, 5, 4, 5, 0, 3, 3, 6, 7, 0, 4, 7, 8, 1, 2, 7, 9, 0, 2, 8, 5, 3, 8, 2, 9, 2, 1, 3, 6, 6, 4, 2, 0, 3, 2, 6, 8, 1, 0, 1, 5, 5, 8, 6, 8, 1, 0, 9, 8, 8, 8, 4, 5, 8, 2, 5, 3, 0, 0, 4, 2, 2, 4, 8, 2, 2, 8, 5, 5, 4, 8, 1, 6, 6, 5, 1, 9, 1, 5, 3, 0, 0, 8, 0, 0, 1, 1, 9, 4, 1, 3, 4, 3, 1, 8, 6, 8, 2, 7, 8, 2, 7, 0, 0, 4, 1, 2, 3, 1, 4, 8, 5, 3, 6, 7, 5, 5, 2, 5, 0, 3, 8, 4, 8, 0, 3, 2, 2, 0, 8, 9, 6, 2, 6, 3, 8, 1, 0, 9, 2, 1, 2, 4, 0, 1, 4, 1, 3, 9, 3, 0, 1, 5, 1, 9, 8, 7, 9, 5, 2, 9, 5, 4, 2, 1, 6, 0, 1, 1, 7, 0, 4, 6, 8, 4, 8, 6, 6, 8, 8, 9, 7, 0, 7, 6, 9, 5, 9, 0, 6, 3, 4, 6, 0, 3, 4, 9, 8, 2, 9, 6, 2, 4, 0, 2, 9, 7, 6, 6, 1, 5, 5, 4, 6, 4, 0, 4, 8, 9, 5, 7, 4, 4, 8, 8, 9, 1, 0, 7, 8, 2, 0, 9, 2, 0, 9, 6, 3, 0, 6, 6, 3, 0, 3, 9, 5, 2, 1, 3, 0, 9, 9, 9, 6, 5, 2, 2, 1, 1, 1, 8, 6, 6, 3, 6, 9, 4, 9, 6, 9, 8, 8, 5, 7, 0, 9, 2, 8, 2, 1, 4, 9, 0, 2, 0, 0, 8, 0, 1, 8, 1, 3, 4, 6, 5, 9, 9, 4, 0, 3, 0, 4, 9, 4, 0, 1, 6, 1, 2, 2, 4, 7, 5, 0, 6, 6, 9, 7, 5, 5, 3, 2, 2, 1, 1, 2, 9, 2, 9, 0, 7, 2, 9, 3, 9, 3, 1, 7, 5, 3, 3, 7, 4, 6, 6, 6, 9, 0, 5, 8, 7, 8, 5, 2, 6, 3, 2, 2, 8, 6, 0, 1, 0, 6, 8, 7, 9, 5, 4, 9, 6, 5, 8, 1, 7, 0, 5, 3, 4, 7, 5, 3, 7, 0, 9, 8, 3, 1, 2, 3, 9, 5, 7, 3, 4, 1, 5, 6, 0, 5, 6, 4, 1, 7, 7, 4, 0, 0, 1, 8, 5, 8, 6, 6, 0, 3, 9, 7, 6, 2, 7, 0, 5, 3, 0, 4, 7, 8, 8, 6, 2, 2, 2, 7, 2, 3, 6, 8, 5, 5, 8, 4, 6, 1, 7, 1, 8, 0, 4, 5, 8, 4, 8, 8, 0, 2, 1, 4, 6, 9, 9, 6, 4, 0, 4, 8, 4, 9, 2, 4, 7, 1, 3, 1, 6, 2, 7, 7, 4, 8, 9, 7, 8, 5, 6, 0, 3, 7, 4, 3, 4, 3, 5, 4, 0, 0, 9, 1, 4, 0, 6, 6, 9, 4, 9, 1, 8, 0, 6, 3, 9, 6, 1, 4, 9, 1, 5, 7, 4, 7, 4, 2, 9, 7, 8, 5, 9, 2, 1, 6, 3, 0, 8, 8, 6, 5, 5, 1, 5, 3, 8, 6, 7, 5, 2, 6, 0, 3, 6, 2, 9, 1, 4, 4, 2, 8, 8, 3, 7, 6, 5, 9, 4, 6, 4, 5, 1, 7, 1, 2, 7, 4, 3, 4, 7, 0, 9, 4, 3, 3, 9, 0, 6, 9, 6, 3, 1, 3, 2, 2, 8, 7, 7, 8, 5, 9, 3, 8, 5, 4, 0, 7, 9, 4, 7, 1, 2, 6, 0, 1, 5, 5, 9, 4, 3, 5, 8, 8, 5, 0, 0, 0, 0, 9, 0, 2, 4, 6, 2, 9, 2, 4, 5, 9, 1, 3, 1, 5, 0, 3, 3, 1, 5, 2, 9, 7, 3, 8, 2, 1, 0, 3, 3, 4, 7, 4, 4, 9, 3, 5, 4, 6, 2, 0, 1, 7, 8, 0, 5, 3, 0, 3, 7, 5, 7, 1, 9, 0, 5, 5, 8, 0, 0, 9, 1, 9, 0, 6, 4, 9, 3, 8, 5, 3, 4, 5, 6, 0, 0, 1, 7, 4, 9, 2, 5, 0, 3, 8, 1, 3, 6, 3, 1, 8, 3, 9, 8, 5, 3, 4, 6, 8, 1, 9, 1, 5, 0, 7, 6, 5, 6, 6, 6, 8, 4, 8, 4, 1, 7, 8, 0, 2, 3, 2, 2, 1, 7, 5, 7, 8, 0, 6, 3, 1, 6, 3, 7, 8, 5, 0, 0, 9, 5, 3, 8, 5, 1, 3, 1, 8, 7, 3, 8, 7, 2, 5, 6, 2, 0, 1, 6, 0, 0, 5, 6, 9, 8, 4, 5, 4, 7, 2, 7, 6, 7, 2, 2, 8, 9, 4, 1, 1, 1, 5, 9, 6, 0, 4, 5, 4, 7, 3, 5, 0, 2, 4, 3, 9, 9, 0, 7, 3, 0, 2, 1, 6, 9, 0, 5, 7, 6, 4, 7, 1, 2, 7, 5, 1, 4, 5, 7, 9, 7, 0, 4, 3, 8, 1, 2, 1, 1, 7, 4, 6, 2, 5, 9, 5, 9, 0, 2, 2, 0, 5, 7, 2, 2, 2, 1, 5, 0, 4, 9, 3, 7, 9, 2, 9, 8, 4, 8, 7, 5, 6, 1, 3, 8, 9, 4, 7, 2, 6, 1, 9, 3, 2, 6, 2, 2, 9, 0, 8, 8, 9, 1, 7, 2, 3, 1, 2, 7, 3, 9, 7, 1, 4, 2, 0, 3, 1, 3, 0, 1, 1, 2, 4, 2, 7, 0, 2, 8, 3, 5, 5, 4, 5, 1, 4, 7, 6, 5, 2, 2, 6, 7, 2, 4, 2, 7, 4, 2, 4, 1, 9, 8, 5, 1, 8, 7, 3, 6, 0, 8, 8, 1, 2, 2, 8, 1, 2, 4, 8, 1, 4, 7, 5, 0, 9, 3, 1, 1, 0, 7, 5, 7, 5, 1, 1, 1, 5, 9, 1, 0, 9, 2, 2, 7, 6, 1, 2, 4, 8, 6, 8, 7, 4, 3, 3, 2, 6, 0, 5, 6, 5, 4, 5, 6, 2, 6, 2, 6, 5, 3, 2, 3, 3, 6, 0, 7, 0, 8, 7, 3, 4, 9, 3, 4, 5, 5, 7, 7, 3, 0, 6, 7, 4, 8, 6, 8, 4, 9, 8, 1, 7, 5, 5, 2, 8, 8, 0, 4, 7, 8, 5, 1, 5, 8, 5, 6, 2, 7, 5, 7, 6, 6, 4, 0, 8, 8, 8, 6, 7, 4, 0, 7, 8, 4, 5, 9, 9, 0, 2, 8, 1, 3, 3, 1, 6, 7, 0, 0, 4, 5, 8, 8, 7, 7, 3, 0, 4, 6, 1, 8, 3, 1, 7, 6, 4, 9, 9, 9, 5, 6, 0, 1, 7, 0, 3, 8, 1, 7, 0, 7, 4, 8, 7, 5, 8, 8, 2, 4, 4, 8, 0, 4, 8, 6, 8, 4, 4, 5, 2, 9, 7, 4, 7, 4, 2, 3, 6, 0, 6, 5, 1, 7, 6, 9, 7, 0, 9, 2, 4, 4, 8, 0, 2, 0, 2, 6, 8, 5, 2, 8, 3, 4, 7, 8, 4, 3, 9, 3, 1, 4, 6, 5, 3, 2, 9, 0, 3, 1, 3, 2, 3, 6, 4, 6, 1, 3, 4, 6, 6, 4, 1, 0, 4, 6, 7, 5, 9, 5, 7, 6, 5, 5, 2, 0, 5, 2, 0, 0, 8, 6, 6, 5, 4, 1, 3, 3, 4, 3, 9, 9, 3, 1, 7, 6, 0, 4, 1, 5, 6, 9, 9, 4, 5, 1, 9, 6, 4, 3, 0, 3, 3, 6, 1, 2, 9, 2, 3, 7, 1, 6, 1, 0, 1, 5, 0, 2, 6, 3, 6, 4, 3, 1, 4, 9, 0, 9, 9, 3, 4, 0, 0, 8, 4, 3, 0, 9, 7, 1, 0, 5, 7, 1, 3, 3, 5, 0, 2, 1, 2, 7, 7, 5, 6, 7, 9, 0, 5, 2, 6, 9, 0, 2, 0, 7, 3, 1, 8, 1, 2, 1, 4, 1, 8, 4, 6, 1, 3, 5, 9, 7, 0, 3, 4, 7, 1, 2, 9, 5, 9, 6, 9, 0, 7, 7, 7, 4, 8, 5, 8, 1, 0, 9, 1, 3, 4, 9, 0, 7, 9, 9, 9, 3, 1, 0, 8, 5, 5, 7, 2, 5, 0, 4, 6, 1, 3, 6, 8, 0, 3, 0, 5, 0, 1, 3, 1, 2, 9, 2, 2, 8, 4, 7, 6, 6, 2, 7, 5, 2, 9, 2, 0, 5, 5, 8, 0, 6, 4, 3, 8, 1, 4, 8, 9, 9, 0, 8, 8, 1, 7, 3, 3, 1, 8, 6, 4, 8, 1, 8, 2, 4, 8, 5, 1, 7, 3, 0, 3, 6, 5, 1, 1, 4, 7, 8, 6, 6, 6, 6, 9, 1, 0, 1, 2, 4, 4, 0, 2, 6, 8, 3, 2, 2, 1, 7, 8, 6, 9, 7, 6, 4, 0, 1, 7, 7, 0, 2, 9, 1, 0, 9, 5, 7, 7, 7, 8, 5, 1, 8, 4, 4, 0, 2, 1, 0, 0, 4, 7, 7, 3, 2, 3, 1, 7, 4, 8, 5, 0, 0, 0, 3, 2, 2, 3, 1, 6, 0, 1, 0, 4, 6, 2, 2, 5, 9, 0, 8, 9, 9, 9, 8, 3, 6, 2, 8, 4, 7, 8, 7, 5, 8, 1, 6, 6, 9, 7, 8, 7, 3, 0, 4, 6, 8, 3, 6, 7, 6, 2, 3, 0, 0, 9, 3, 2, 6, 4, 7, 2, 9, 7, 4, 5, 2, 9, 0, 2, 7, 2, 7, 1, 6, 4, 6, 4, 9, 1, 6, 5, 9, 0, 4, 8, 8, 1, 1, 1, 3, 8, 7, 5, 4, 5, 5, 1, 7, 8, 8, 7, 9, 0, 0, 9, 2, 8, 0, 8, 7, 7, 9, 3, 8, 6, 1, 0, 3, 3, 0, 4, 3, 2, 4, 3, 6, 7, 3, 2, 2, 9, 8, 5, 6, 6, 9, 0, 9, 0, 9, 8, 0, 7, 2, 3, 4, 6, 6, 8, 3, 1, 5, 6, 1, 0, 4, 7, 8, 0, 6, 9, 0, 4, 0, 5, 6, 6, 7, 5, 3, 5, 7, 1, 2, 2, 7, 3, 9, 1, 8, 5, 2, 6, 8, 2, 0, 3, 3, 2, 3, 2, 5, 7, 0, 8, 7, 0, 0, 7, 4, 4, 9, 7, 5, 9, 9, 2, 4, 2, 4, 4, 5, 1, 6, 9, 4, 3, 6, 6, 0, 6, 0, 9, 6, 1, 4, 9, 6, 1, 9, 5, 3, 8, 4, 8, 2, 3, 4, 3, 5, 1, 3, 4, 1, 1, 4, 9, 0, 7, 8, 5, 9, 9, 8, 6, 6, 0, 0, 9, 7, 2, 1, 4, 2, 3, 8, 3, 0, 4, 6, 3, 6, 5, 3, 3, 9, 4, 0, 0, 6, 8, 2, 0, 9, 6, 1, 8, 4, 1, 0, 0, 7, 3, 7, 8, 1, 2, 6, 1, 9, 1, 2, 9, 7, 8, 1, 0, 9, 7, 9, 1, 6, 0, 8, 1, 3, 8, 6, 4, 2, 2, 8, 7, 1, 5, 8, 4, 6, 8, 7, 4, 8, 0, 8, 6, 1, 4, 7, 7, 8, 7, 0, 5, 2, 4, 9, 3, 7, 2, 7, 3, 5, 5, 1, 1, 2, 2, 6, 3, 2, 3, 2, 9, 1, 7, 8, 9, 3, 6, 5, 9, 5, 7, 3, 3, 4, 3, 8, 3, 1, 5, 7, 2, 4, 0, 1, 6, 4, 5, 6, 9, 9, 1, 4, 7, 2, 2, 9, 5, 9, 6, 6, 0, 2, 6, 2, 6, 7, 6, 2, 3, 4, 5, 8, 1, 3, 7, 5, 8, 9, 8, 4, 5, 8, 1, 2, 2, 8, 8, 4, 5, 9, 3, 7, 8, 2, 1, 9, 0, 9, 8, 3, 7, 7, 2, 1, 9, 0, 3, 1, 8, 6, 5, 4, 6, 8, 0, 2, 5, 1, 5, 3, 4, 9, 6, 4, 9, 4, 4, 4, 9, 9, 6, 4, 9, 7, 0, 3, 7, 6, 3, 4, 8, 5, 7, 9, 3, 2, 8, 8, 8, 3, 6, 3, 2, 0, 8, 5, 6, 2, 4, 4, 8, 2, 2, 6, 5, 0, 8, 9, 2, 1, 5, 6, 4, 6, 2, 6, 7, 2, 7, 2, 8, 5, 2, 7, 0, 3, 3, 1, 5, 1, 4, 9, 2, 9, 0, 2, 3, 7, 9, 9, 6, 3, 2, 2, 0, 1, 4, 7, 5, 8, 7, 6, 5, 6, 6, 7, 4, 4, 2, 7, 6, 7, 2, 7, 0, 4, 9, 0, 2, 0, 9, 6, 2, 6, 1, 0, 0, 9, 5, 9, 1, 7, 8, 1, 8, 7, 8, 2, 3, 9, 6, 6, 1, 1, 0, 6, 5, 4, 1, 9, 8, 1, 2, 4, 2, 8, 1, 5, 9, 1, 3, 2, 6, 4, 4, 5, 8, 0, 1, 7, 7, 3, 3, 7, 1, 1, 7, 6, 8, 0, 7, 9, 7, 4, 8, 9, 3, 5, 3, 5, 9, 8, 1, 3, 3, 6, 7, 4, 1, 9, 4, 7, 4, 2, 5, 5, 4, 0, 8, 9, 8, 6, 8, 0, 2, 4, 1, 7, 2, 0, 5, 5, 5, 0, 6, 1, 5, 9, 6, 4, 1, 9, 7, 2, 9, 2, 6, 1, 8, 4, 1, 8, 3, 7, 2, 2, 2, 3, 5, 2, 9, 7, 3, 1, 5, 3, 1, 7, 2, 1, 5, 4, 3, 6, 3, 9, 2, 2, 5, 0, 8, 8, 7, 5, 0, 3, 2, 1, 6, 4, 1, 5, 5, 5, 1, 4, 5, 1, 2, 2, 6, 2, 3, 8, 8, 2, 7, 6, 5, 6, 7, 2, 6, 6, 3, 6, 4, 2, 2, 9, 0, 8, 5, 2, 9, 8, 3, 1, 9, 4, 5, 1, 4, 2, 6, 1, 6, 9, 1, 6, 0, 0, 9, 9, 1, 3, 7, 2, 0, 6, 9, 8, 0, 1, 2, 0, 3, 4, 3, 7, 3, 7, 0, 5, 9, 4, 2, 7, 0, 6, 0, 6, 6, 2, 9, 9, 0, 1, 4, 0, 7, 7, 1, 5, 5, 4, 7, 6, 0, 1, 1, 7, 9, 6, 3, 2, 5, 5, 6, 5, 3, 3, 1, 5, 2, 0, 1, 1, 1, 2, 1, 1, 9, 3, 8, 4, 6, 0, 9, 6, 7, 3, 8, 3, 7, 0, 5, 5, 0, 2, 9, 4, 0, 2, 4, 1, 2, 5, 1, 3, 0, 5, 2, 9, 9, 0, 1, 2, 9, 3, 0, 0, 5, 3, 6, 4, 1, 4, 9, 5, 0, 7, 0, 1, 7, 9, 3, 9, 5, 3, 8, 3, 3, 8, 5, 0, 8, 6, 7, 5, 5, 9, 4, 8, 4, 3, 4, 7, 7, 4, 1, 6, 2, 7, 1, 0, 3, 9, 1, 9, 9, 5, 8, 7, 9, 0, 3, 7, 0, 1, 9, 1, 2, 4, 1, 5, 4, 9, 9, 2, 1, 5, 8, 0, 7, 6, 0, 3, 2, 7, 6, 6, 8, 0, 4, 6, 8, 0, 0, 5, 7, 5, 1, 1, 9, 1, 1, 8, 1, 8, 3, 5, 1, 6, 5, 5, 6, 4, 0, 8, 4, 4, 5, 2, 3, 5, 9, 0, 0, 2, 9, 0, 2, 2, 1, 7, 6, 9, 8, 6, 4, 7, 3, 0, 4, 2, 6, 4, 8, 0, 8, 2, 5, 5, 1, 7, 9, 6, 1, 0, 0, 8, 4, 3, 2, 5, 6, 4, 5, 3, 1, 2, 5, 4, 2, 1, 2, 3, 0, 6, 9, 1, 4, 8, 6, 5, 5, 8, 6, 2, 6, 2, 1, 3, 7, 1, 6, 4, 8, 0, 0, 4, 3, 1, 8, 8, 8, 0, 0, 9, 5, 9, 5, 5, 8, 3, 7, 7, 1, 4, 9, 7, 5, 6, 6, 8, 6, 1, 7, 8, 7, 6, 1, 1, 3, 3, 8, 1, 7, 5, 8, 0, 4, 8, 6, 2, 4, 2, 5, 4, 6, 1, 9, 4, 8, 6, 0, 7, 8, 6, 0, 4, 3, 5, 5, 7, 8, 1, 7, 2, 5, 3, 1, 2, 2, 1, 3, 0, 2, 6, 5, 8, 2, 2, 6, 1, 0, 2, 6, 5, 7, 4, 1, 2, 2, 2, 5, 1, 6, 8, 5, 0, 0, 0, 3, 9, 0, 2, 7, 2, 6, 1, 0, 6, 2, 9, 8, 6, 9, 9, 7, 0, 4, 2, 2, 6, 6, 1, 9, 4, 7, 7, 9, 9, 1, 5, 5, 1, 6, 5, 9, 8, 4, 7, 0, 3, 0, 0, 0, 3, 9, 1, 9, 3, 4, 5, 3, 8, 0, 1, 2, 8, 3, 0, 5, 8, 1, 8, 7, 5, 1, 6, 6, 7, 2, 4, 5, 4, 3, 3, 0, 3, 8, 3, 4, 0, 8, 0, 0, 1, 7, 5, 1, 6, 3, 6, 7, 2, 0, 2, 9, 4, 2, 2, 8, 6, 5, 5, 3, 1, 9, 2, 7, 7, 3, 3, 0, 6, 1, 8, 1, 8, 7, 7, 0, 7, 0, 8, 6, 0, 6, 5, 5, 7, 1, 6, 6, 9, 6, 0, 5, 7, 6, 5, 1, 4, 2, 6, 5, 1, 0, 4, 3, 4, 1, 1, 5, 2, 5, 7, 5, 6, 5, 3, 7, 2, 2, 0, 6, 1, 3, 7, 5, 8, 4, 0, 6, 8, 5, 0, 2, 5, 0, 6, 7, 0, 8, 1, 7, 9, 3, 2, 3, 5, 0, 2, 4, 1, 2, 5, 3, 2, 2, 5, 5, 4, 7, 4, 6, 0, 6, 9, 8, 1, 6, 7, 9, 3, 2, 3, 0, 0, 5, 3, 4, 8, 6, 6, 4, 8, 1, 5, 1, 2, 3, 4, 7, 4, 2, 8, 8, 9, 1, 9, 6, 0, 9, 2, 9, 9, 1, 6, 3, 9, 2, 8, 2, 1, 2, 7, 6, 8, 9, 1, 8, 9, 7, 5, 0, 3, 3, 3, 8, 4, 2, 3, 2, 1, 0, 7, 0, 6, 8, 8, 5, 6, 0, 6, 1, 6, 3, 6, 7, 6, 2, 7, 2, 1, 4, 6, 3, 5, 8, 8, 6, 1, 6, 6, 1, 8, 2, 5, 7, 3, 5, 3, 2, 1, 9, 2, 7, 4, 2, 3, 3, 1, 9, 6, 2, 6, 5, 6, 4, 5, 1, 0, 9, 0, 2, 7, 7, 8, 9, 7, 2, 2, 3, 6, 1, 3, 3, 9, 8, 6, 2, 6, 0, 6, 2, 2, 9, 9, 6, 1, 8, 7, 7, 7, 7, 1, 6, 6, 7, 1, 8, 9, 8, 8, 7, 5, 0, 3, 4, 2, 8, 2, 6, 0, 9, 2, 7, 5, 6, 5, 5, 9, 0, 5, 7, 7, 1, 6, 8, 1, 9, 9, 9, 0, 7, 5, 3, 3, 0, 8, 7, 3, 6, 2, 6, 8, 0, 3, 8, 1, 7, 4, 5, 3, 5, 2, 2, 0, 4, 4, 7, 2, 9, 3, 8, 7, 7, 3, 0, 8, 8, 4, 1, 6, 9, 6, 8, 8, 9, 9, 2, 1, 6, 7, 9, 2, 7, 8, 1, 4, 3, 6, 8, 6, 8, 1, 0, 2, 9, 3, 2, 7, 4, 8, 7, 9, 6, 5, 0, 5, 3, 5, 3, 0, 9, 9, 7, 1, 8, 8, 9, 8, 4, 0, 9, 1, 7, 5, 2, 8, 8, 7, 5, 3, 8, 1, 3, 2, 2, 5, 8, 8, 9, 3, 7, 5, 8, 0, 1, 3, 4, 5, 4, 6, 1, 5, 0, 3, 9, 9, 9, 3, 7, 5, 7, 3, 5, 0, 4, 1, 3, 7, 5, 5, 3, 5, 4, 1, 0, 4, 0, 8, 4, 3, 1, 7, 7, 6, 6, 0, 7, 0, 1, 8, 3, 6, 2, 1, 2, 1, 8, 1, 3, 7, 2, 5, 0, 2, 2, 3, 2, 7, 1, 6, 8, 6, 5, 3, 6, 7, 2, 9, 7, 2, 9, 0, 0, 2, 7, 2, 2, 4, 7, 3, 1, 6, 0, 6, 8, 2, 6, 8, 2, 0, 0, 2, 3, 3, 6, 9, 1, 7, 7, 6, 7, 9, 0, 5, 1, 7, 7, 5, 5, 2, 6, 3, 2, 8, 3, 4, 9, 3, 4, 9, 2, 9, 4, 7, 1, 6, 3, 6, 4, 0, 4, 2, 4, 1, 3, 7, 1, 7, 5, 6, 8, 4, 7, 8, 1, 1, 1, 6, 8, 4, 9, 7, 8, 0, 6, 4, 0, 0, 7, 2, 5, 5, 8, 0, 4, 9, 7, 8, 5, 6, 5, 6, 3, 6, 9, 3, 5, 0, 6, 3, 6, 0, 8, 8, 6, 4, 2, 3, 8, 8, 6, 4, 7, 9, 0, 1, 4, 0, 8, 8, 6, 4, 2, 6, 7, 0, 3, 5, 2, 9, 4, 0, 7, 6, 6, 9, 5, 7, 0, 0, 5, 7, 8, 6, 8, 2, 3, 9, 0, 0, 9, 6, 6, 4, 6, 4, 6, 0, 8, 6, 8, 6, 5, 0, 4, 3, 3, 1, 0, 8, 8, 3, 1, 7, 4, 5, 2, 1, 1, 4, 9, 0, 5, 7, 0, 4, 6, 9, 8, 1, 1, 2, 5, 0, 1, 4, 5, 6, 3, 9, 3, 6, 0, 1, 5, 6, 5, 0, 0, 8, 6, 5, 9, 7, 5, 9, 7, 0, 1, 6, 6, 3, 0, 4, 9, 7, 3, 3, 1, 5, 1, 8, 8, 2, 2, 1, 2, 1, 7, 2, 2, 8, 3, 9, 1, 8, 9, 7, 1, 8, 7, 1, 2, 9, 0, 9, 7, 1, 0, 5, 9, 1, 8, 6, 4, 4, 2, 2, 1, 2, 7, 7, 7, 5, 2, 1, 8, 2, 9, 7, 0, 7, 7, 1, 4, 0, 0, 4, 6, 5, 2, 9, 9, 8, 4, 4, 7, 8, 4, 5, 3, 3, 3, 7, 9, 6, 9, 1, 8, 3, 3, 3, 7, 8, 6, 9, 0, 3, 9, 7, 7, 9, 3, 1, 2, 3, 5, 4, 9, 8, 0, 0, 9, 9, 7, 0, 7, 6, 9, 5, 6, 6, 4, 5, 4, 0, 6, 4, 3, 7, 2, 6, 9, 7, 5, 9, 1, 4, 5, 2, 9, 7, 3, 1, 5, 1, 4, 9, 0, 3, 7, 1, 4, 9, 4, 2, 5, 0, 4, 0, 1, 6, 8, 4, 7, 6, 7, 1, 1, 6, 7, 5, 4, 9, 7, 7, 2, 2, 3, 2, 5, 5, 1, 8, 5, 7, 1, 7, 0, 2, 7, 0, 9, 8, 0, 6, 6, 1, 0, 5, 6, 6, 9, 3, 4, 2, 6, 8, 4, 6, 2, 1, 8, 5, 2, 0, 0, 2, 7, 0, 8, 8, 4, 5, 8, 5, 6, 9, 7, 5, 2, 1, 0, 5, 2, 8, 9, 9, 9, 8, 5, 7, 6, 7, 1, 8, 5, 0, 5, 1, 1, 9, 9, 8, 9, 8, 1, 8, 4, 8, 2, 6, 1, 1, 7, 6, 0, 2, 2, 9, 4, 3, 5, 1, 5, 7, 5, 6, 4, 0, 5, 3, 7, 9, 1, 9, 3, 2, 7, 0, 3, 5, 0, 7, 0, 8, 6, 0, 2, 3, 6, 5, 9, 1, 7, 9, 1, 1, 3, 8, 8, 2, 7, 6, 6, 7, 1, 3, 4, 9, 0, 5, 2, 6, 3, 0, 9, 0, 2, 6, 0, 2, 5, 3, 9, 8, 8, 2, 8, 5, 5, 4, 3, 0, 7, 1, 6, 2, 3, 6, 4, 5, 9, 2, 3, 7, 2, 3, 9, 2, 3, 7, 6, 6, 2, 7, 7, 4, 5, 5, 0, 2, 0, 7, 0, 3, 0, 2, 2, 9, 5, 6, 2, 4, 0, 2, 6, 3, 5, 3, 2, 6, 1, 6, 6, 1, 0, 8, 5, 0, 8, 5, 2, 3, 0, 3, 9, 8, 6, 8, 0, 5, 9, 4, 9, 5, 9, 8, 4, 9, 6, 4, 0, 5, 6, 9, 6, 3, 5, 5, 1, 4, 1, 6, 8, 5, 5, 9, 3, 9, 8, 7, 6, 9, 2, 7, 8, 1, 3, 1, 6, 4, 6, 6, 5, 7, 0, 3, 0, 1, 2, 9, 5, 7, 5, 4, 8, 9, 8, 2, 9, 7, 6, 8, 2, 4, 8, 8, 3, 1, 2, 2, 6, 7, 1, 0, 0, 6, 4, 1, 7, 2, 5, 6, 8, 6, 6, 2, 8, 1, 8, 2, 8, 7, 1, 1, 2, 5, 9, 6, 5, 0, 2, 2, 3, 9, 8, 5, 3, 2, 1, 8, 2, 1, 1, 5, 3, 5, 5, 7, 4, 5, 0, 7, 8, 4, 3, 7, 1, 5, 9, 4, 6, 7, 5, 9, 5, 3, 2, 0, 7, 4, 8, 2, 3, 7, 6, 2, 6, 4, 5, 5, 7, 1, 4, 9, 9, 1, 8, 4, 6, 7, 5, 4, 7, 4, 4, 8, 2, 8, 6, 8, 8, 2, 1, 6, 7, 1, 6, 4, 1, 0, 5, 3, 9, 0, 4, 5, 3, 2, 5, 1, 9, 5, 6, 1, 1, 2, 1, 4, 8, 2, 3, 9, 0, 5, 8, 1, 9, 9, 4, 9, 4, 9, 9, 6, 1, 3, 4, 8, 1, 7, 7, 1, 6, 7, 7, 7, 6, 6, 3, 1, 0, 2, 8, 3, 1, 9, 0, 4, 4, 3, 1, 3, 4, 4, 9, 1, 0, 8, 5, 8, 7, 9, 1, 4, 1, 8, 5, 7, 9, 1, 2, 4, 8, 1, 7, 5, 9, 4, 0, 7, 5, 8, 0, 8, 6, 6, 4, 2, 8, 3, 6, 8, 2, 7, 1, 4, 9, 0, 8, 5, 0, 4, 7, 4, 4, 2, 2, 1, 9, 6, 3, 0, 1, 7, 2, 5, 2, 8, 7, 6, 4, 8, 9, 3, 4, 6, 2, 8, 9, 0, 2, 1, 9, 7, 5, 2, 1, 3, 3, 6, 5, 4, 0, 1, 2, 0, 5, 0, 3, 6, 4, 7, 4, 4, 9, 6, 9, 1, 6, 8, 1, 6, 3, 8, 9, 7, 4, 2, 1, 6, 3, 5, 8, 5, 1, 1, 8, 2, 2, 9, 4, 8, 0, 3, 5, 2, 3, 5, 4, 3, 1, 7, 7, 9, 7, 3, 2, 1, 4, 5, 2, 9, 8, 2, 0, 3, 3, 5, 2, 4, 3, 0, 8, 0, 8, 7, 6, 6, 5, 3, 4, 1, 2, 7, 5, 7, 5, 1, 9, 4, 0, 8, 1, 5, 0, 5, 6, 1, 2, 9, 4, 9, 2, 7, 9, 6, 7, 7, 6, 5, 1, 3, 7, 3, 3, 0, 0, 1, 0, 2, 2, 4, 7, 0, 8, 6, 9, 5, 2, 1, 8, 7, 2, 7, 3, 1, 3, 0, 7, 5, 2, 5, 0, 2, 2, 2, 2, 6, 0, 0, 8, 1, 8, 9, 8, 7, 2, 2, 6, 2, 8, 1, 2, 2, 3, 0, 1, 7, 9, 2, 7, 8, 8, 4, 3, 6, 6, 1, 1, 7, 0, 2, 9, 6, 9, 3, 5, 2, 8, 6, 0, 7, 3, 1, 1, 0, 9, 8, 6, 6, 1, 9, 3, 7, 0, 4, 5, 5, 4, 8, 1, 1, 3, 4, 1, 1, 5, 1, 2, 1, 1, 0, 7, 1, 7, 1, 0, 8, 2, 3, 1, 1, 3, 6, 4, 6, 3, 7, 3, 5, 3, 1, 5, 5, 3, 0, 3, 6, 0, 4, 2, 8, 4, 4, 4, 7, 6, 3, 7, 9, 8, 9, 9, 3, 8, 9, 8, 0, 5, 1, 3, 8, 4, 3, 8, 9, 0, 6, 2, 8, 5, 8, 8, 5, 1, 6, 9, 5, 8, 1, 9, 1, 0, 5, 5, 6, 9, 6, 8, 6, 3, 8, 2, 4, 2, 4, 2, 7, 4, 8, 3, 7, 8, 5, 0, 0, 7, 1, 2, 8, 5, 5, 1, 1, 2, 5, 5, 6, 2, 6, 4, 1, 6, 7, 6, 7, 3, 2, 9, 2, 8, 0, 3, 9, 3, 5, 2, 3, 5, 4, 6, 5, 8, 9, 6, 4, 1, 5, 4, 4, 2, 4, 6, 8, 9, 7, 3, 8, 0, 3, 6, 8, 9, 7, 2, 4, 8, 8, 9, 9, 4, 1, 3, 1, 0, 0, 0, 8, 9, 4, 1, 1, 2, 6, 6, 1, 5, 8, 1, 3, 0, 7, 0, 4, 2, 9, 2, 9, 3, 3, 5, 7, 7, 7, 0, 7, 1, 7, 5, 4, 0, 0, 2, 5, 6, 4, 8, 9, 3, 6, 5, 5, 6, 5, 0, 0, 5, 9, 7, 0, 2, 7, 6, 9, 8, 0, 2, 9, 6, 2, 8, 1, 3, 1, 5, 4, 1, 4, 5, 8, 0, 5, 1, 4, 4, 1, 9, 6, 7, 9, 3, 9, 0, 5, 2, 7, 3, 2, 2, 9, 6, 2, 5, 1, 7, 0, 5, 6, 2, 5, 0, 2, 8, 9, 6, 3, 0, 2, 6, 0, 0, 8, 8, 7, 8, 3, 1, 0, 3, 2, 0, 2, 3, 9, 1, 0, 5, 9, 6, 5, 3, 8, 6, 0, 9, 3, 5, 9, 4, 3, 4, 4, 7, 2, 5, 7, 1, 1, 2, 9, 7, 8, 2, 5, 4, 1, 8, 6, 6, 5, 5, 8, 6, 8, 1, 5, 7, 7, 6, 7, 3, 4, 0, 7, 2, 4, 3, 0, 2, 5, 6, 1, 3, 2, 1, 0, 0, 1, 7, 8, 1, 2, 2, 0, 8, 2, 9, 1, 4, 6, 3, 7, 7, 2, 0, 0, 2, 4, 6, 7, 0, 4, 4, 8, 0, 0, 6, 5, 9, 7, 9, 6, 7, 1, 4, 5, 7, 7, 0, 0, 0, 2, 9, 4, 0, 2, 0, 9, 8, 1, 0, 2, 3, 1, 8, 5, 9, 0, 2, 0, 8, 6, 2, 8, 2, 0, 4, 0, 9, 6, 0, 4, 6, 2, 7, 6, 1, 7, 1, 9, 9, 3, 9, 6, 5, 2, 0, 6, 9, 6, 7, 4, 5, 6, 1, 6, 3, 6, 7, 6, 7, 1, 2, 2, 0, 0, 8, 4, 2, 1, 5, 2, 7, 8, 6, 2, 7, 9, 2, 3, 6, 6, 7, 5, 9, 9, 4, 4, 0, 0, 9, 6, 2, 7, 3, 8, 1, 3, 6, 1, 0, 4, 1, 6, 6, 6, 6, 2, 1, 4, 1, 7, 1, 5, 8, 6, 9, 3, 6, 4, 4, 4, 1, 6, 4, 4, 3, 8, 0, 0, 3, 4, 5, 3, 2, 4, 1, 1, 6, 9, 4, 2, 8, 3, 4, 7, 2, 5, 9, 9, 6, 5, 3, 4, 2, 4, 1, 6, 5, 7, 1, 8, 9, 7, 9, 1, 6, 0, 1, 0, 5, 6, 0, 9, 7, 2, 9, 3, 2, 2, 2, 2, 9, 8, 8, 2, 4, 4, 7, 0, 3, 0, 4, 8, 1, 8, 0, 3, 5, 0, 1, 8, 0, 5, 8, 6, 4, 4, 9, 4, 1, 7, 0, 5, 0, 4, 0, 7, 3, 5, 9, 3, 8, 6, 2, 0, 7, 0, 0, 7, 0, 8, 6, 3, 2, 4, 0, 0, 1, 1, 3, 9, 3, 9, 4, 1, 2, 6, 2, 7, 1, 2, 6, 2, 9, 6, 5, 6, 3, 9, 7, 2, 6, 8, 5, 5, 1, 5, 1, 8, 7, 0, 4, 5, 8, 5, 3, 2, 8, 3, 2, 6, 7, 5, 0, 5, 9, 1, 0, 4, 0, 8, 7, 6, 6, 3, 6, 3, 9, 4, 5, 8, 9, 5, 7, 4, 4, 4, 8, 6, 4, 2, 6, 1, 3, 1, 6, 7, 2, 6, 4, 4, 1, 0, 2, 1, 6, 7, 5, 8, 7, 3, 4, 0, 6, 4, 7, 6, 9, 7, 2, 5, 5, 7, 9, 1, 6, 7, 1, 2, 5, 3, 4, 4, 2, 5, 4, 0, 0, 9, 7, 3, 8, 6, 2, 0, 2, 0, 5, 8, 0, 5, 0, 7, 4, 5, 7, 5, 0, 8, 4, 3, 2, 7, 3, 2, 4, 2, 3, 1, 2, 5, 9, 7, 9, 0, 8, 1, 3, 4, 7, 3, 4, 6, 9, 7, 4, 4, 2, 5, 1, 4, 4, 2, 9, 9, 2, 7, 0, 5, 2, 3, 9, 4, 3, 2, 8, 1, 2, 0, 1, 4, 3, 5, 5, 7, 6, 0, 7, 8, 5, 6, 0, 6, 6, 0, 3, 6, 1, 8, 7, 1, 3, 7, 9, 8, 9, 9, 4, 0, 5, 5, 1, 7, 8, 0, 7, 0, 0, 7, 3, 7, 8, 6, 4, 5, 7, 9, 3, 1, 1, 4, 8, 8, 6, 7, 1, 3, 4, 1, 4, 3, 8, 2, 1, 6, 5, 1, 4, 2, 1, 8, 5, 6, 2, 9, 4, 0, 1, 0, 5, 8, 2, 0, 0, 0, 4, 6, 2, 0, 2, 3, 2, 1, 3, 4, 1, 1, 3, 0, 0, 6, 9, 6, 6, 0, 3, 8, 1, 3, 0, 9, 6, 2, 6, 5, 6, 0, 3, 8, 4, 1, 8, 8, 9, 0, 2, 4, 4, 2, 8, 2, 3, 4, 0, 1, 1, 7, 1, 6, 1, 8, 2, 7, 6, 6, 9, 7, 9, 2, 5, 8, 2, 3, 2, 3, 3, 5, 0, 7, 5, 8, 2, 9, 4, 7, 3, 7, 8, 4, 2, 6, 8, 2, 0, 2, 7, 9, 2, 9, 0, 0, 1, 4, 8, 9, 2, 0, 4, 0, 4, 8, 7, 9, 7, 2, 2, 4, 1, 3, 2, 2, 1, 9, 6, 6, 2, 4, 6, 6, 7, 1, 0, 2, 4, 3, 5, 7, 1, 0, 6, 4, 0, 0, 3, 3, 1, 7, 8, 0, 2, 1, 6, 9, 9, 7, 7, 2, 0, 2, 2, 6, 2, 4, 7, 1, 2, 7, 1, 2, 2, 4, 4, 6, 9, 2, 9, 0, 3, 0, 0, 6, 1, 6, 9, 4, 9, 3, 8, 4, 6, 4, 0, 7, 6, 3, 0, 5, 2, 4, 9, 2, 8, 3, 7, 1, 8, 2, 1, 9, 6, 4, 4, 6, 8, 9, 4, 7, 0, 4, 3, 4, 9, 9, 6, 8, 6, 1, 3, 9, 3, 8, 1, 0, 8, 5, 7, 7, 7, 4, 9, 4, 4, 5, 8, 6, 1, 4, 8, 2, 2, 0, 5, 4, 0, 5, 8, 4, 1, 4, 2, 6, 0, 3, 2, 0, 7, 1, 8, 2, 9, 1, 4, 5, 6, 2, 9, 6, 0, 6, 8, 6, 8, 3, 4, 8, 7, 9, 3, 7, 8, 4, 6, 4, 7, 0, 2, 3, 0, 4, 4, 0, 4, 0, 3, 0, 7, 9, 4, 9, 5, 3, 3, 0, 1, 6, 3, 5, 9, 6, 4, 4, 7, 3, 5, 5, 4, 2, 7, 5, 6, 3, 8, 6, 4, 5, 7, 6, 8, 1, 7, 2, 7, 7, 6, 7, 0, 3, 9, 9, 5, 7, 5, 2, 0, 7, 9, 7, 1, 1, 8, 6, 4, 4, 8, 4, 1, 4, 1, 5, 2, 0, 6, 0, 1, 8, 0, 7, 4, 1, 1, 3, 4, 9, 3, 7, 8, 7, 6, 7, 1, 9, 0, 9, 4, 5, 7, 5, 7, 8, 9, 6, 4, 0, 4, 1, 1, 4, 1, 0, 1, 6, 7, 2, 7, 1, 4, 8, 2, 4, 1, 0, 9, 0, 9, 4, 1, 9, 2, 3, 3, 4, 0, 7, 3, 3, 9, 0, 7, 7, 1, 8, 6, 4, 0, 4, 7, 4, 0, 8, 1, 2, 1, 3, 6, 2, 9, 2, 8, 4, 1, 4, 1, 1, 6, 8, 1, 4, 2, 9, 2, 4, 4, 2, 8, 0, 5, 7, 1, 7, 5, 9, 1, 7, 5, 2, 7, 6, 2, 9, 2, 9, 2, 1, 2, 6, 2, 8, 3, 9, 7, 1, 0, 3, 1, 4, 6, 1, 6, 5, 4, 9, 0, 9, 2, 0, 5, 7, 9, 2, 5, 9, 2, 1, 3, 4, 8, 9, 1, 3, 3, 7, 2, 6, 6, 1, 7, 6, 4, 0, 8, 6, 2, 8, 1, 3, 6, 6, 7, 7, 3, 7, 6, 7, 0, 2, 2, 2, 1, 3, 3, 3, 6, 2, 2, 2, 1, 8, 2, 0, 4, 4, 2, 4, 3, 1, 9, 5, 8, 3, 3, 4, 5, 8, 5, 7, 7, 8, 4, 7, 1, 6, 0, 7, 9, 0, 0, 9, 0, 4, 9, 2, 8, 8, 9, 1, 5, 7, 9, 4, 6, 0, 2, 9, 2, 0, 9, 1, 0, 6, 7, 5, 4, 4, 6, 0, 0, 6, 5, 2, 8, 2, 2, 2, 7, 8, 5, 6, 5, 5, 8, 4, 4, 1, 7, 8, 5, 5, 3, 8, 8, 2, 7, 9, 5, 7, 7, 3, 9, 0, 8, 0, 6, 0, 2, 2, 7, 6, 4, 1, 3, 2, 6, 3, 7, 4, 3, 8, 4, 7, 7, 9, 2, 1, 5, 7, 1, 3, 5, 3, 9, 0, 0, 4, 0, 0, 5, 2, 1, 5, 8, 8, 2, 4, 7, 1, 4, 8, 4, 9, 4, 3, 3, 5, 3, 8, 1, 0, 1, 7, 7, 0, 7, 4, 1, 4, 7, 2, 8, 0, 0, 7, 1, 3, 5, 7, 6, 7, 1, 9, 7, 5, 3, 7, 0, 1, 9, 9, 2, 7, 5, 2, 8, 1, 0, 3, 9, 0, 7, 7, 0, 0, 1, 6, 3, 5, 4, 9, 3, 6, 7, 7, 4, 5, 7, 9, 0, 1, 1, 1, 0, 0, 1, 1, 0, 6, 2, 6, 6, 9, 7, 4, 0, 4, 3, 7, 3, 8, 9, 8, 0, 4, 3, 2, 2, 6, 1, 2, 3, 9, 3, 0, 9, 4, 9, 0, 6, 4, 9, 8, 1, 2, 9, 9, 3, 9, 3, 7, 6, 0, 2, 2, 6, 8, 5, 8, 4, 5, 3, 7, 7, 2, 9, 0, 9, 4, 8, 2, 5, 4, 3, 3, 4, 5, 4, 4, 8, 4, 5, 1, 8, 9, 7, 1, 9, 0, 8, 3, 7, 0, 5, 4, 7, 6, 6, 7, 9, 4, 4, 4, 5, 4, 7, 7, 9, 9, 1, 7, 5, 3, 7, 4, 5, 9, 9, 0, 8, 2, 1, 3, 9, 6, 1, 9, 8, 9, 5, 2, 0, 3, 6, 9, 2, 8, 6, 0, 8, 6, 7, 7, 8, 6, 6, 3, 2, 9, 6, 1, 1, 4, 0, 1, 3, 2, 2, 1, 1, 8, 9, 6, 8, 6, 4, 6, 8, 3, 5, 5, 1, 3, 4, 1, 1, 2, 6, 3, 9, 3, 7, 4, 2, 1, 8, 8, 0, 1, 8, 9, 4, 5, 9, 0, 0, 8, 4, 0, 6, 6, 1, 2, 8, 5, 8, 2, 4, 9, 9, 9, 0, 7, 3, 7, 0, 9, 9, 6, 6, 5, 0, 6, 1, 2, 8, 2, 3, 6, 8, 2, 9, 9, 0, 9, 8, 6, 2, 2, 6, 7, 9, 2, 0, 6, 1, 1, 6, 1, 3, 0, 7, 6, 0, 0, 0, 1, 4, 8, 0, 2, 1, 9, 7, 1, 8, 4, 8, 1, 0, 7, 2, 2, 5, 9, 7, 2, 9, 0, 1, 1, 3, 8, 0, 5, 2, 2, 6, 2, 1, 7, 8, 0, 2, 3, 7, 4, 3, 0, 5, 3, 9, 7, 4, 9, 9, 5, 2, 8, 1, 5, 8, 7, 0, 9, 0, 0, 9, 8, 0, 2, 8, 4, 5, 5, 5, 4, 7, 6, 5, 3, 6, 0, 5, 1, 0, 1, 2, 7, 0, 2, 6, 8, 9, 2, 4, 5, 9, 4, 1, 7, 2, 9, 9, 3, 3, 0, 0, 2, 6, 2, 3, 8, 8, 1, 6, 2, 3, 6, 5, 0, 9, 2, 0, 3, 0, 9, 1, 3, 2, 3, 2, 9, 1, 4, 2, 7, 0, 6, 1, 3, 9, 3, 5, 5, 5, 1, 3, 2, 6, 6, 8, 2, 7, 8, 2, 9, 9, 7, 8, 4, 8, 9, 3, 6, 7, 7, 1, 5, 1, 5, 5, 0, 8, 0, 7, 2, 9, 7, 3, 6, 1, 8, 2, 8, 8, 1, 7, 0, 2, 3, 3, 4, 9, 3, 5, 0, 1, 8, 4, 7, 9, 5, 8, 2, 8, 0, 5, 4, 5, 8, 0, 2, 1, 2, 9, 4, 8, 3, 0, 5, 3, 0, 9, 4, 2, 0, 6, 3, 2, 7, 2, 5, 2, 5, 7, 0, 8, 6, 8, 5, 3, 1, 3, 4, 6, 8, 2, 4, 8, 2, 7, 1, 8, 1, 0, 2, 0, 3, 4, 4, 2, 3, 7, 7, 6, 1, 4, 4, 6, 5, 5, 7, 3, 2, 6, 7, 3, 4, 3, 8, 6, 4, 4, 6, 9, 9, 9, 2, 8, 2, 6, 8, 8, 4, 2, 8, 4, 3, 6, 1, 1, 4, 0, 7, 7, 2, 3, 8, 1, 2, 9, 3, 6, 0, 7, 5, 8, 0, 8, 7, 1, 3, 7, 5, 8, 4, 1, 9, 2, 8, 5, 0, 2, 6, 7, 6, 6, 0, 5, 8, 3, 9, 7, 3, 5, 5, 3, 8, 4, 5, 1, 6, 7, 0, 0, 2, 0, 7, 8, 1, 8, 4, 6, 6, 6, 7, 2, 1, 4, 2, 4, 1, 0, 6, 9, 1, 5, 6, 4, 4, 2, 1, 5, 2, 8, 0, 0, 7, 2, 1, 5, 4, 3, 6, 2, 5, 7, 2, 9, 5, 8, 0, 6, 8, 6, 7, 0, 7, 6, 1, 9, 6, 9, 0, 5, 1, 9, 1, 1, 2, 3, 2, 3, 8, 8, 7, 1, 2, 7, 4, 7, 7, 1, 7, 8, 1, 9, 6, 5, 4, 1, 6, 6, 3, 0, 2, 0, 5, 7, 2, 6, 2, 8, 5, 2, 6, 1, 5, 3, 6, 2, 6, 1, 6, 9, 4, 5, 0, 3, 0, 9, 1, 3, 7, 8, 0, 8, 8, 4, 2, 3, 5, 6, 5, 3, 2, 8, 0, 6, 7, 1, 7, 0, 8, 6, 9, 1, 7, 8, 3, 2, 6, 4, 2, 8, 9, 0, 2, 0, 1, 5, 9, 6, 4, 7, 4, 8, 4, 4, 5, 2, 7, 5, 6, 4, 5, 9, 1, 4, 2, 3, 7, 3, 6, 3, 1, 3, 0, 2, 1, 5, 0, 3, 1, 2, 5, 1, 6, 5, 0, 7, 0, 8, 1, 2, 3, 0, 3, 3, 2, 9, 2, 0, 1, 6, 6, 1, 4, 4, 2, 5, 4, 2, 9, 3, 4, 1, 0, 2, 5, 5, 6, 9, 4, 7, 4, 4, 0, 2, 9, 6, 3, 4, 3, 0, 3, 2, 5, 8, 4, 4, 0, 9, 7, 9, 8, 8, 0, 0, 6, 6, 4, 3, 7, 0, 4, 4, 5, 1, 9, 1, 3, 8, 7, 0, 0, 0, 2, 8, 6, 8, 7, 0, 5, 0, 0, 1, 5, 7, 7, 1, 1, 5, 4, 1, 5, 2, 7, 0, 3, 7, 3, 8, 0, 8, 5, 7, 0, 2, 2, 1, 3, 6, 5, 1, 0, 2, 1, 8, 9, 9, 2, 0, 3, 9, 8, 7, 7, 6, 3, 7, 1, 6, 0, 9, 0, 0, 4, 1, 4, 0, 5, 6, 3, 7, 2, 0, 4, 6, 2, 4, 4, 6, 3, 2, 7, 4, 2, 9, 6, 0, 9, 9, 0, 1, 2, 8, 6, 4, 6, 8, 0, 4, 5, 8, 7, 6, 7, 8, 6, 7, 5, 6, 7, 5, 9, 5, 2, 6, 1, 1, 5, 8, 4, 8, 3, 9, 4, 4, 0, 7, 0, 3, 4, 3, 7, 9, 0, 5, 8, 9, 0, 9, 2, 4, 4, 0, 9, 1, 3, 1, 9, 7, 9, 3, 6, 9, 6, 5, 7, 8, 0, 2, 4, 3, 7, 5, 5, 6, 1, 8, 7, 6, 9, 7, 3, 0, 3, 6, 4, 4, 1, 8, 1, 4, 4, 4, 6, 1, 8, 6, 8, 9, 2, 2, 3, 8, 2, 0, 8, 8, 8, 7, 2, 2, 0, 3, 6, 6, 9, 3, 7, 0, 6, 9, 3, 3, 3, 2, 9, 0, 0, 5, 0, 5, 7, 4, 3, 9, 0, 2, 9, 6, 4, 3, 3, 9, 9, 4, 5, 5, 4, 8, 0, 1, 7, 8, 1, 1, 3, 0, 5, 3, 1, 8, 2, 6, 2, 8, 2, 2, 6, 1, 3, 8, 6, 6, 0, 5, 1, 0, 3, 9, 1, 8, 5, 6, 1, 3, 9, 6, 4, 6, 8, 2, 7, 4, 8, 8, 2, 3, 7, 7, 9, 1, 3, 5, 1, 8, 7, 2, 1, 9, 1, 5, 1, 9, 9, 7, 8, 4, 1, 0, 8, 3, 7, 3, 8, 3, 9, 0, 3, 9, 2, 8, 9, 3, 8, 3, 8, 2, 8, 5, 9, 4, 3, 8, 9, 7, 4, 8, 7, 7, 7, 7, 0, 8, 6, 0, 1, 2, 0, 4, 0, 1, 6, 0, 0, 7, 5, 3, 8, 3, 3, 3, 0, 8, 7, 8, 8, 7, 8, 0, 8, 5, 8, 7, 0, 5, 6, 7, 7, 9, 3, 0, 4, 5, 4, 9, 9, 2, 6, 7, 7, 6, 5, 7, 0, 0, 1, 1, 1, 0, 7, 8, 7, 9, 1, 1, 6, 8, 6, 1, 3, 3, 4, 1, 7, 5, 2, 8, 4, 3, 8, 4, 3, 2, 8, 7, 6, 2, 5, 6, 6, 6, 6, 4, 9, 3, 2, 9, 4, 3, 0, 8, 8, 9, 8, 6, 6, 1, 8, 3, 4, 6, 6, 9, 4, 8, 8, 4, 9, 5, 5, 3, 9, 8, 5, 4, 5, 2, 9, 2, 4, 5, 8, 0, 9, 6, 6, 7, 1, 0, 8, 4, 1, 6, 0, 1, 4, 4, 7, 5, 7, 6, 9, 1, 4, 8, 7, 1, 9, 6, 8, 9, 2, 7, 2, 9, 3, 5, 5, 8, 6, 2, 2, 3, 8, 4, 2, 2, 2, 1, 4, 6, 3, 6, 0, 6, 4, 5, 3, 0, 3, 0, 0, 9, 0, 8, 4, 0, 9, 5, 1, 2, 5, 9, 4, 4, 8, 5, 7, 6, 7, 8, 5, 6, 5, 5, 5, 8, 2, 2, 9, 1, 8, 3, 8, 3, 6, 5, 7, 0, 2, 0, 2, 9, 6, 3, 0, 2, 6, 3, 6, 2, 1, 5, 2, 1, 3, 3, 2, 6, 1, 2, 4, 7, 5, 3, 7, 1, 5, 8, 4, 1, 2, 5, 0, 9, 2, 1, 1, 9, 2, 7, 2, 3, 7, 6, 2, 0, 2, 4, 4, 6, 0, 2, 0, 8, 2, 9, 1, 2, 1, 8, 6, 9, 4, 1, 4, 2, 9, 8, 1, 0, 7, 7, 9, 3, 8, 8, 3, 7, 1, 4, 7, 9, 0, 6, 6, 8, 2, 7, 0, 9, 0, 7, 4, 6, 5, 6, 5, 0, 5, 7, 1, 2, 4, 1, 1, 7, 9, 6, 9, 6, 9, 2, 5, 3, 9, 7, 1, 9, 5, 1, 8, 1, 1, 5, 9, 4, 0, 9, 2, 8, 9, 8, 2, 2, 3, 3, 2, 2, 9, 1, 1, 1, 0, 3, 0, 1, 0, 5, 2, 1, 2, 0, 6, 1, 3, 7, 1, 2, 6, 4, 5, 0, 6, 6, 6, 6, 4, 0, 0, 1, 4, 6, 1, 2, 5, 0, 7, 7, 1, 2, 3, 1, 3, 2, 5, 1, 7, 1, 0, 8, 9, 0, 0, 3, 1, 5, 6, 6, 6, 3, 1, 4, 8, 7, 2, 1, 2, 3, 0, 2, 8, 0, 9, 6, 9, 4, 0, 1, 1, 0, 6, 0, 3, 2, 7, 6, 6, 3, 9, 6, 2, 2, 2, 5, 1, 4, 9, 5, 8, 5, 9, 2, 9, 1, 7, 2, 1, 4, 6, 6, 2, 2, 0, 8, 9, 5, 0, 6, 6, 7, 2, 9, 6, 3, 6, 9, 9, 2, 7, 9, 8, 8, 1, 3, 7, 9, 6, 6, 5, 4, 8, 4, 8, 2, 4, 9, 9, 7, 8, 9, 6, 0, 6, 2, 9, 2, 9, 2, 7, 5, 6, 7, 0, 1, 1, 9, 8, 3, 7, 7, 3, 6, 8, 2, 2, 3, 2, 5, 2, 4, 8, 3, 2, 6, 7, 3, 2, 1, 4, 2, 7, 2, 6, 5, 0, 0, 0, 5, 1, 9, 2, 6, 4, 8, 9, 8, 4, 4, 3, 6, 7, 4, 7, 9, 4, 4, 7, 8, 4, 3, 9, 2, 3, 4, 7, 4, 0, 7, 5, 5, 6, 9, 2, 8, 3, 1, 8, 0, 5, 2, 9, 3, 3, 0, 8, 7, 4, 2, 7, 1, 0, 7, 1, 0, 5, 0, 6, 4, 2, 8, 3, 2, 7, 2, 6, 3, 5, 2, 0, 2, 7, 6, 1, 6, 1, 0, 8, 2, 2, 0, 3, 1, 1, 5, 9, 0, 8, 0, 9, 5, 7, 9, 2, 4, 7, 1, 4, 4, 3, 3, 5, 8, 7, 3, 6, 6, 6, 4, 0, 0, 1, 2, 7, 0, 5, 6, 0, 1, 6, 1, 9, 5, 1, 0, 2, 1, 2, 1, 5, 3, 4, 6, 8, 4, 8, 0, 2, 4, 8, 6, 5, 1, 9, 0, 0, 2, 6, 3, 4, 7, 7, 1, 6, 4, 7, 4, 3, 6, 8, 5, 9, 0, 7, 7, 7, 7, 6, 6, 9, 1, 2, 0, 0, 8, 2, 8, 9, 9, 6, 4, 4, 3, 1, 0, 7, 9, 6, 0, 3, 4, 0, 5, 4, 7, 8, 3, 6, 0, 9, 3, 7, 0, 1, 4, 5, 2, 7, 4, 9, 0, 8, 0, 0, 4, 7, 9, 4, 7, 3, 5, 1, 9, 9, 3, 2, 4, 2, 7, 9, 9, 6, 8, 3, 3, 7, 5, 1, 7, 5, 4, 9, 1, 3, 5, 2, 5, 5, 9, 4, 4, 1, 7, 8, 5, 1, 9, 1, 7, 7, 1, 0, 2, 9, 3, 3, 7, 2, 5, 9, 0, 6, 3, 0, 6, 8, 6, 8, 8, 0, 7, 4, 5, 7, 0, 7, 1, 4, 4, 7, 4, 6, 7, 2, 3, 2, 4, 7, 0, 8, 9, 7, 4, 9, 1, 0, 3, 9, 5, 3, 5, 7, 4, 8, 2, 9, 6, 9, 1, 8, 1, 0, 9, 0, 9, 6, 8, 9, 2, 2, 1, 2, 8, 2, 4, 5, 2, 0, 8, 7, 5, 5, 4, 0, 2, 0, 7, 5, 1, 2, 1, 5, 5, 1, 2, 7, 3, 8, 7, 2, 2, 4, 9, 7, 5, 2, 4, 4, 9, 2, 1, 0, 7, 2, 9, 1, 3, 4, 4, 8, 9, 1, 0, 4, 8, 7, 9, 7, 3, 8, 3, 2, 6, 7, 1, 1, 3, 5, 6, 1, 8, 7, 4, 4, 1, 5, 5, 0, 4, 5, 6, 4, 5, 5, 0, 6, 3, 9, 5, 9, 1, 7, 0, 7, 7, 2, 1, 2, 9, 7, 5, 8, 1, 9, 9, 4, 7, 2, 8, 8, 5, 2, 4, 0, 1, 4, 9, 0, 7, 3, 0, 4, 3, 9, 2, 3, 1, 8, 1, 0, 8, 1, 2, 6, 4, 1, 2, 2, 2, 4, 4, 9, 3, 2, 7, 6, 5, 4, 1, 9, 3, 8, 4, 6, 9, 7, 8, 8, 8, 6, 0, 8, 5, 6, 4, 8, 0, 8, 7, 9, 3, 0, 3, 2, 5, 2, 1, 4, 9, 4, 3, 5, 2, 8, 8, 5, 6, 7, 2, 7, 8, 2, 1, 1, 5, 2, 4, 6, 0, 6, 8, 0, 6, 2, 5, 5, 7, 0, 0, 3, 4, 7, 7, 5, 1, 8, 3, 1, 4, 5, 7, 0, 2, 3, 1, 0, 1, 0, 5, 4, 6, 4, 8, 4, 1, 1, 4, 0, 9, 8, 3, 7, 6, 4, 1, 8, 9, 3, 0, 0, 6, 3, 2, 9, 3, 0, 0, 6, 4, 7, 0, 1, 3, 4, 7, 9, 0, 1, 4, 8, 0, 1, 8, 6, 7, 5, 7, 2, 6, 7, 3, 8, 9, 7, 2, 2, 6, 7, 8, 9, 1, 6, 5, 1, 4, 7, 4, 2, 7, 6, 6, 1, 2, 4, 6, 9, 4, 6, 2, 3, 3, 0, 2, 2, 8, 4, 3, 4, 6, 3, 5, 4, 0, 8, 6, 6, 8, 9, 0, 9, 1, 5, 4, 5, 3, 1, 0, 5, 4, 5, 9, 4, 9, 7, 1, 6, 0, 1, 3, 8, 6, 5, 0, 7, 6, 7, 7, 8, 4, 1, 8, 8, 6, 3, 1, 4, 8, 3, 8, 3, 1, 4, 9, 6, 7, 5, 7, 7, 4, 7, 2, 1, 7, 2, 2, 2, 7, 7, 6, 0, 0, 9, 8, 4, 7, 6, 6, 8, 0, 1, 8, 0, 6, 3, 9, 6, 7, 8, 9, 4, 5, 2, 5, 0, 6, 9, 8, 2, 7, 7, 1, 9, 3, 3, 7, 0, 7, 2, 8, 3, 8, 1, 1, 2, 1, 8, 4, 2, 1, 3, 3, 7, 1, 7, 1, 5, 9, 9, 6, 9, 1, 6, 2, 7, 5, 0, 9, 3, 2, 5, 1, 7, 2, 0, 8, 9, 7, 3, 1, 5, 0, 9, 1, 1, 0, 6, 3, 1, 3, 1, 4, 7, 5, 0, 2, 6, 9, 7, 7, 4, 1, 4, 6, 3, 1, 2, 0, 4, 6, 3, 4, 4, 4, 8, 5, 7, 1, 7, 9, 3, 7, 0, 6, 6, 7, 4, 8, 8, 5, 3, 6, 2, 7, 0, 5, 2, 3, 5, 2, 6, 7, 2, 0, 6, 1, 2, 0, 3, 6, 1, 3, 0, 1, 5, 0, 0, 2, 2, 0, 1, 2, 3, 2, 1, 5, 4, 8, 8, 3, 9, 1, 0, 8, 4, 4, 5, 1, 7, 0, 3, 2, 7, 6, 2, 0, 4, 1, 5, 7, 9, 3, 1, 0, 1, 9, 7, 7, 9, 0, 5, 2, 7, 8, 7, 4, 8, 8, 4, 9, 9, 3, 2, 2, 5, 1, 5, 8, 4, 0, 0, 7, 4, 7, 6, 6, 6, 4, 2, 6, 4, 2, 1, 8, 1, 5, 6, 3, 5, 4, 1, 6, 3, 0, 1, 1, 3, 3, 8, 1, 5, 7, 7, 6, 2, 3, 6, 5, 8, 0, 9, 4, 7, 1, 0, 2, 5, 6, 5, 7, 3, 9, 9, 7, 5, 1, 2, 3, 1, 8, 6, 8, 8, 4, 7, 9, 7, 8, 8, 6, 3, 4, 7, 4, 0, 9, 5, 4, 4, 1, 6, 0, 9, 4, 0, 5, 1, 3, 2, 7, 6, 6, 1, 8, 6, 5, 8, 8, 4, 1, 9, 7, 1, 3, 8, 2, 3, 6, 7, 9, 8, 6, 3, 2, 1, 2, 6, 1, 1, 6, 6, 2, 2, 0, 7, 2, 1, 8, 8, 6, 3, 6, 6, 6, 2, 6, 9, 1, 3, 0, 9, 1, 8, 8, 8, 7, 7, 8, 8, 6, 0, 2, 2, 6, 7, 6, 3, 8, 1, 4, 8, 2, 1, 8, 6, 0, 7, 4, 3, 1, 6, 9, 3, 1, 2, 6, 6, 0, 9, 4, 3, 0, 5, 9, 7, 6, 7, 2, 7, 4, 7, 9, 5, 3, 2, 6, 1, 7, 2, 9, 3, 8, 0, 5, 2, 5, 2, 9, 5, 0, 5, 4, 1, 3, 8, 7, 9, 1, 2, 9, 9, 6, 8, 3, 4, 9, 7, 9, 9, 6, 7, 9, 0, 6, 1, 5, 9, 7, 7, 7, 2, 7, 0, 3, 9, 1, 2, 3, 3, 4, 2, 1, 5, 3, 4, 6, 3, 1, 9, 1, 2, 9, 2, 4, 8, 5, 1, 1, 3, 9, 2, 2, 7, 1, 5, 2, 8, 3, 4, 0, 5, 1, 2, 9, 4, 2, 0, 8, 9, 2, 1, 4, 2, 8, 8, 6, 6, 5, 2, 9, 8, 5, 0, 5, 0, 4, 5, 8, 9, 8, 3, 7, 5, 2, 8, 2, 4, 6, 1, 6, 7, 8, 3, 5, 1, 4, 1, 1, 0, 8, 2, 0, 0, 1, 9, 8, 4, 3, 2, 9, 3, 3, 7, 2, 6, 9, 8, 7, 0, 9, 0, 1, 8, 2, 7, 1, 2, 4, 0, 9, 4, 7, 9, 6, 7, 4, 0, 6, 8, 4, 6, 4, 2, 7, 1, 5, 4, 4, 9, 7, 7, 9, 7, 6, 8, 5, 7, 1, 2, 8, 8, 0, 4, 6, 0, 4, 9, 1, 5, 2, 0, 6, 1, 8, 2, 3, 2, 7, 4, 6, 3, 0, 7, 9, 5, 3, 1, 4, 3, 8, 2, 8, 3, 4, 9, 7, 8, 9, 5, 9, 0, 8, 6, 2, 2, 6, 1, 1, 9, 9, 7, 5, 9, 1, 3, 7, 5, 6, 5, 4, 0, 9, 6, 7, 2, 0, 3, 0, 6, 2, 1, 5, 7, 4, 0, 5, 4, 1, 6, 7, 0, 5, 9, 2, 5, 1, 3, 1, 5, 3, 6, 7, 9, 0, 3, 6, 5, 1, 7, 4, 0, 2, 5, 5, 0, 9, 7, 3, 7, 5, 9, 0, 8, 8, 1, 6, 2, 1, 1, 0, 3, 3, 3, 8, 0, 2, 3, 2, 6, 1, 4, 4, 7, 6, 6, 2, 4, 7, 0, 7, 6, 3, 2, 8, 9, 8, 1, 9, 6, 8, 0, 7, 2, 5, 6, 0, 7, 2, 1, 1, 4, 6, 8, 8, 7, 1, 3, 7, 1, 7, 7, 7, 9, 2, 8, 5, 0, 0, 7, 3, 5, 3, 4, 7, 0, 7, 8, 9, 3, 5, 7, 8, 5, 5, 6, 3, 5, 7, 8, 5, 5, 0, 8, 8, 0, 6, 6, 4, 3, 2, 9, 2, 4, 1, 3, 8, 5, 9, 9, 9, 6, 2, 1, 8, 5, 0, 3, 4, 5, 5, 0, 5, 8, 7, 7, 4, 8, 3, 9, 2, 1, 9, 9, 1, 7, 0, 8, 0, 2, 0, 0, 6, 2, 5, 3, 8, 9, 0, 6, 7, 4, 3, 4, 3, 3, 7, 1, 1, 3, 9, 9, 3, 8, 9, 5, 9, 6, 1, 5, 3, 1, 0, 2, 4, 6, 3, 0, 2, 7, 2, 2, 2, 0, 4, 1, 6, 0, 4, 5, 1, 3, 9, 0, 7, 5, 1, 1, 6, 9, 6, 9, 0, 5, 4, 9, 4, 8, 4, 8, 7, 5, 0, 7, 1, 2, 9, 4, 0, 2, 3, 4, 0, 7, 0, 1, 4, 6, 9, 0, 4, 4, 4, 8, 4, 2, 8, 3, 8, 2, 8, 2, 6, 3, 1, 6, 5, 8, 0, 9, 1, 7, 0, 5, 2, 2, 1, 8, 8, 2, 1, 0, 9, 2, 3, 0, 6, 2, 3, 0, 7, 9, 3, 9, 4, 7, 7, 6, 8, 7, 2, 0, 4, 9, 7, 6, 5, 4, 9, 0, 6, 5, 4, 7, 7, 5, 6, 8, 0, 7, 5, 5, 2, 1, 4, 0, 8, 2, 5, 8, 2, 4, 4, 2, 9, 1, 5, 5, 5, 4, 9, 7, 2, 3, 5, 5, 2, 2, 3, 1, 9, 2, 9, 3, 4, 8, 4, 3, 4, 5, 9, 8, 2, 1, 4, 0, 7, 1, 1, 5, 2, 0, 5, 8, 3, 1, 7, 5, 4, 3, 5, 8, 4, 1, 9, 6, 0, 7, 1, 4, 9, 3, 6, 2, 1, 5, 5, 5, 5, 1, 0, 7, 2, 7, 2, 1, 1, 3, 8, 8, 5, 7, 6, 1, 0, 2, 0, 4, 8, 7, 4, 4, 2, 6, 8, 4, 7, 3, 1, 7, 4, 3, 1, 4, 4, 3, 7, 2, 9, 8, 3, 0, 8, 7, 2, 7, 7, 8, 9, 7, 8, 8, 4, 2, 2, 9, 6, 6, 7, 8, 6, 1, 7, 8, 2, 7, 7, 5, 4, 8, 0, 1, 3, 6, 2, 5, 9, 0, 4, 3, 7, 1, 5, 8, 3, 2, 8, 7, 5, 7, 8, 0, 9, 6, 2, 8, 0, 0, 2, 9, 2, 9, 7, 8, 5, 7, 4, 9, 9, 9, 8, 4, 1, 9, 1, 1, 0, 0, 4, 7, 9, 5, 8, 3, 5, 4, 9, 6, 9, 2, 9, 8, 0, 0, 9, 0, 2, 6, 2, 0, 1, 2, 3, 4, 5, 1, 3, 4, 5, 6, 8, 7, 2, 4, 4, 8, 4, 3, 7, 3, 2, 9, 0, 8, 7, 7, 6, 6, 7, 2, 5, 3, 8, 4, 3, 2, 6, 6, 4, 7, 7, 4, 9, 1, 3, 0, 1, 0, 5, 6, 0, 1, 3, 2, 6, 7, 7, 6, 0, 9, 0, 2, 6, 3, 7, 0, 8, 7, 2, 0, 2, 6, 8, 2, 0, 7, 3, 5, 1, 0, 6, 6, 4, 4, 0, 0, 2, 6, 9, 8, 1, 2, 0, 1, 9, 7, 3, 6, 4, 4, 7, 8, 1, 3, 8, 4, 4, 5, 3, 5, 5, 8, 9, 6, 5, 3, 0, 6, 5, 2, 4, 4, 4, 4, 2, 3, 7, 0, 1, 7, 9, 7, 0, 3, 5, 1, 1, 6, 6, 9, 0, 7, 8, 8, 0, 9, 0, 7, 7, 9, 1, 0, 8, 0, 8, 7, 4, 7, 4, 3, 3, 0, 8, 4, 5, 2, 5, 1, 1, 4, 6, 6, 1, 7, 1, 5, 9, 4, 0, 8, 8, 4, 0, 4, 7, 2, 6, 3, 5, 0, 3, 3, 4, 1, 6, 4, 8, 4, 5, 2, 1, 4, 5, 8, 5, 0, 5, 6, 6, 7, 8, 8, 6, 4, 0, 0, 8, 6, 6, 5, 9, 4, 4, 2, 3, 9, 5, 4, 6, 6, 6, 7, 4, 8, 2, 7, 2, 1, 8, 3, 2, 3, 4, 8, 2, 3, 5, 1, 1, 0, 5, 4, 6, 8, 2, 3, 4, 3, 0, 4, 4, 5, 1, 2, 0, 2, 4, 1, 3, 6, 1, 1, 8, 1, 0, 0, 2, 8, 2, 7, 8, 0, 6, 9, 4, 0, 7, 1, 6, 3, 0, 7, 4, 3, 7, 0, 4, 1, 9, 1, 0, 8, 5, 0, 7, 7, 0, 3, 9, 0, 0, 9, 9, 7, 1, 0, 4, 6, 5, 6, 2, 0, 3, 3, 0, 1, 1, 1, 3, 2, 4, 7, 3, 6, 6, 4, 2, 8, 9, 2, 3, 4, 8, 7, 6, 6, 7, 7, 1, 7, 7, 6, 9, 7, 5, 1, 6, 9, 1, 2, 1, 0, 7, 2, 6, 2, 7, 3, 9, 0, 1, 2, 1, 2, 2, 2, 9, 1, 9, 0, 0, 9, 7, 7, 3, 2, 9, 3, 8, 1, 3, 6, 8, 8, 8, 4, 6, 1, 5, 9, 2, 9, 4, 0, 7, 7, 0, 7, 4, 5, 0, 5, 9, 8, 6, 5, 2, 9, 0, 2, 4, 5, 0, 1, 7, 0, 3, 8, 1, 2, 5, 2, 4, 8, 9, 6, 3, 1, 2, 8, 2, 4, 4, 0, 4, 8, 7, 4, 1, 4, 0, 3, 7, 7, 4, 2, 0, 9, 1, 9, 0, 7, 5, 6, 5, 9, 5, 9, 1, 3, 5, 7, 9, 7, 6, 0, 2, 4, 6, 8, 5, 4, 4, 0, 1, 7, 3, 3, 7, 7, 0, 8, 2, 7, 6, 2, 8, 9, 2, 0, 4, 2, 8, 3, 9, 4, 4, 6, 3, 0, 0, 7, 7, 3, 2, 2, 3, 6, 1, 6, 1, 1, 8, 2, 1, 9, 9, 0, 2, 1, 3, 7, 8, 5, 6, 6, 2, 5, 9, 0, 1, 9, 6, 6, 8, 8, 9, 1, 7, 1, 6, 3, 9, 7, 8, 6, 0, 9, 3, 7, 8, 1, 9, 5, 0, 4, 0, 1, 1, 9, 4, 3, 1, 7, 2, 6, 5, 2, 6, 4, 3, 8, 7, 3, 2, 5, 5, 6, 0, 5, 6, 7, 5, 2, 5, 7, 9, 7, 1, 5, 6, 3, 7, 8, 9, 4, 1, 0, 9, 8, 5, 7, 7, 9, 1, 4, 6, 0, 2, 1, 7, 7, 0, 2, 9, 1, 4, 1, 4, 0, 3, 7, 0, 7, 2, 6, 6, 6, 2, 6, 6, 8, 4, 3, 0, 3, 4, 6, 2, 0, 3, 8, 0, 2, 6, 7, 5, 5, 2, 1, 7, 6, 9, 4, 0, 2, 5, 9, 8, 3, 3, 2, 5, 0, 4, 6, 3, 3, 7, 2, 3, 9, 0, 9, 2, 7, 9, 3, 6, 6, 7, 5, 2, 1, 8, 1, 6, 0, 8, 8, 7, 6, 2, 9, 3, 2, 0, 4, 6, 6, 1, 8, 5, 6, 6, 7, 6, 5, 9, 2, 6, 8, 9, 1, 7, 6, 7, 2, 6, 3, 6, 7, 2, 3, 6, 8, 8, 4, 0, 6, 1, 7, 5, 9, 5, 3, 3, 1, 2, 5, 5, 0, 0, 7, 8, 5, 0, 3, 3, 0, 3, 3, 4, 9, 7, 5, 5, 6, 4, 6, 1, 9, 1, 0, 2, 9, 3, 7, 6, 5, 4, 7, 4, 5, 5, 7, 8, 7, 9, 6, 0, 8, 2, 3, 4, 8, 9, 2, 4, 1, 8, 1, 6, 2, 7, 7, 9, 7, 6, 4, 2, 9, 0, 6, 1, 2, 6, 7, 7, 7, 8, 4, 6, 7, 6, 3, 6, 7, 4, 4, 1, 1, 5, 4, 8, 1, 0, 6, 4, 4, 7, 6, 0, 6, 7, 1, 8, 2, 2, 0, 8, 4, 4, 3, 5, 8, 8, 7, 7, 2, 5, 6, 8, 5, 7, 3, 7, 2, 6, 4, 1, 8, 8, 9, 6, 3, 3, 9, 0, 3, 4, 0, 3, 7, 4, 3, 7, 9, 4, 8, 4, 8, 7, 2, 7, 4, 7, 4, 1, 6, 1, 1, 6, 4, 8, 2, 3, 5, 1, 6, 9, 2, 8, 6, 1, 0, 7, 7, 0, 5, 6, 1, 0, 8, 0, 8, 7, 7, 0, 3, 9, 7, 2, 5, 4, 0, 6, 9, 6, 4, 8, 3, 4, 3, 8, 9, 3, 5, 6, 5, 9, 1, 1, 3, 3, 5, 6, 7, 4, 4, 0, 2, 7, 5, 4, 0, 8, 5, 5, 3, 3, 6, 3, 5, 2, 6, 7, 0, 4, 3, 8, 3, 7, 1, 0, 1, 9, 5, 2, 3, 3, 1, 3, 2, 0, 5, 3, 7, 7, 0, 8, 9, 6, 6, 4, 3, 2, 1, 7, 2, 5, 8, 3, 2, 2, 6, 5, 3, 5, 7, 5, 1, 6, 1, 7, 8, 8, 4, 0, 2, 6, 7, 7, 6, 5, 7, 0, 5, 9, 8, 0, 8, 1, 2, 6, 8, 9, 9, 7, 0, 9, 5, 7, 1, 5, 7, 8, 0, 7, 9, 3, 7, 3, 9, 1, 9, 6, 9, 1, 2, 7, 8, 3, 9, 4, 9, 3, 1, 9, 0, 7, 5, 4, 5, 8, 6, 6, 7, 2, 8, 0, 6, 9, 5, 5, 8, 7, 8, 1, 8, 3, 9, 7, 3, 4, 7, 9, 8, 8, 1, 6, 6, 2, 7, 3, 3, 6, 0, 1, 1, 2, 3, 4, 3, 0, 8, 3, 7, 2, 5, 9, 0, 5, 7, 7, 5, 9, 3, 7, 3, 9, 9, 8, 9, 0, 7, 0, 9, 7, 6, 5, 3, 9, 0, 6, 8, 2, 5, 7, 0, 1, 4, 4, 7, 8, 5, 9, 9, 0, 7, 9, 2, 6, 3, 2, 1, 8, 1, 2, 6, 6, 3, 3, 0, 1, 3, 0, 2, 2, 8, 6, 1, 6, 4, 3, 8, 2, 4, 6, 0, 4, 3, 7, 1, 9, 6, 6, 7, 4, 4, 9, 9, 5, 7, 0, 1, 2, 1, 3, 0, 5, 9, 8, 8, 4, 0, 0, 9, 4, 7, 7, 6, 4, 7, 2, 3, 5, 8, 9, 5, 9, 6, 0, 8, 3, 8, 0, 1, 7, 9, 4, 5, 2, 0, 2, 9, 0, 7, 9, 7, 5, 3, 2, 2, 5, 8, 8, 0, 3, 3, 1, 6, 4, 0, 8, 3, 6, 5, 8, 3, 3, 6, 8, 6, 4, 7, 7, 2, 1, 6, 1, 2, 0, 0, 0, 4, 6, 1, 3, 0, 0, 2, 9, 3, 8, 1, 1, 4, 7, 6, 6, 5, 7, 5, 9, 3, 7, 4, 8, 0, 3, 8, 3, 5, 9, 2, 1, 3, 2, 2, 5, 7, 5, 0, 6, 4, 8, 2, 7, 4, 1, 9, 0, 8, 7, 9, 7, 6, 4, 2, 1, 7, 9, 7, 4, 5, 6, 1, 1, 7, 7, 1, 9, 9, 0, 3, 6, 2, 4, 8, 2, 9, 9, 1, 6, 3, 6, 5, 9, 3, 8, 9, 2, 9, 9, 3, 7, 6, 7, 6, 1, 3, 0, 0, 5, 7, 8, 1, 9, 3, 1, 6, 6, 3, 4, 4, 5, 8, 0, 7, 4, 1, 6, 0, 5, 5, 2, 5, 4, 2, 9, 3, 8, 9, 8, 4, 2, 7, 2, 0, 8, 4, 1, 1, 6, 4, 0, 1, 6, 0, 4, 7, 5, 1, 0, 3, 9, 6, 9, 9, 7, 0, 6, 2, 7, 0, 6, 9, 3, 9, 8, 8, 5, 0, 7, 1, 0, 2, 0, 0, 8, 6, 3, 3, 2, 3, 1, 2, 5, 6, 2, 8, 2, 6, 0, 2, 5, 9, 9, 0, 5, 0, 2, 9, 4, 6, 3, 7, 6, 2, 2, 0, 0, 9, 8, 7, 3, 7, 7, 5, 4, 4, 2, 9, 1, 9, 4, 5, 3, 1, 4, 1, 8, 6, 0, 5, 2, 6, 8, 1, 9, 6, 8, 0, 8, 7, 9, 3, 1, 9, 5, 6, 0, 2, 1, 4, 7, 7, 3, 4, 1, 6, 8, 0, 4, 1, 8, 9, 2, 0, 3, 6, 2, 4, 4, 3, 2, 2, 6, 7, 3, 6, 5, 7, 3, 5, 8, 4, 8, 0, 0, 3, 0, 5, 3, 3, 8, 3, 2, 1, 3, 1, 1, 3, 3, 8, 0, 1, 1, 7, 4, 6, 1, 2, 3, 0, 5, 5, 0, 3, 9, 3, 5, 8, 6, 8, 1, 8, 7, 0, 4, 1, 8, 9, 7, 7, 0, 5, 3, 1, 4, 8, 5, 3, 5, 1, 0, 3, 0, 8, 2, 1, 1, 9, 1, 6, 4, 0, 4, 4, 0, 3, 8, 1, 6, 3, 5, 9, 9, 8, 4, 2, 7, 1, 0, 3, 1, 1, 1, 0, 6, 8, 1, 5, 8, 1, 0, 5, 0, 1, 4, 1, 9, 5, 0, 9, 6, 9, 5, 6, 0, 3, 1, 4, 3, 0, 4, 4, 3, 9, 0, 2, 9, 3, 3, 1, 1, 2, 1, 7, 5, 8, 3, 7, 1, 1, 1, 5, 8, 0, 9, 9, 4, 1, 7, 3, 3, 8, 8, 0, 7, 8, 7, 0, 4, 1, 2, 2, 3, 0, 9, 3, 6, 5, 0, 0, 4, 2, 2, 9, 1, 4, 5, 7, 0, 2, 0, 1, 7, 9, 8, 3, 7, 6, 0, 5, 4, 1, 0, 6, 3, 4, 0, 9, 1, 2, 7, 4, 0, 6, 5, 2, 0, 3, 7, 5, 1, 7, 6, 7, 2, 1, 0, 0, 1, 4, 8, 2, 2, 4, 6, 4, 1, 3, 8, 3, 8, 9, 6, 4, 1, 4, 8, 1, 5, 6, 0, 4, 5, 9, 1, 0, 2, 6, 4, 1, 0, 1, 7, 3, 2, 7, 7, 7, 1, 5, 2, 9, 5, 9, 9, 0, 4, 9, 5, 1, 4, 3, 1, 6, 4, 9, 4, 3, 3, 3, 8, 0, 7, 1, 0, 8, 0, 6, 3, 0, 1, 5, 4, 3, 2, 9, 6, 7, 1, 5, 8, 1, 2, 5, 1, 1, 0, 0, 9, 6, 0, 3, 3, 1, 0, 3, 2, 3, 1, 5, 3, 2, 2, 3, 4, 9, 2, 5, 8, 0, 2, 4, 2, 6, 5, 1, 9, 7, 5, 0, 1, 4, 2, 3, 0, 2, 6, 7, 1, 6, 4, 4, 8, 6, 2, 4, 2, 7, 7, 5, 4, 5, 7, 4, 3, 5, 7, 7, 3, 3, 1, 8, 6, 1, 5, 2, 8, 1, 3, 6, 7, 4, 2, 3, 0, 7, 9, 0, 8, 7, 1, 4, 3, 3, 4, 0, 9, 8, 7, 9, 9, 3, 8, 1, 6, 6, 1, 4, 9, 2, 9, 3, 3, 1, 7, 6, 0, 7, 3, 2, 6, 2, 4, 1, 7, 9, 2, 2, 0, 3, 2, 2, 9, 4, 1, 2, 6, 8, 6, 0, 9, 6, 0, 6, 7, 0, 2, 4, 3, 6, 3, 6, 3, 9, 2, 4, 3, 4, 8, 5, 0, 2, 3, 2, 0, 3, 5, 7, 4, 5, 4, 7, 9, 9, 2, 9, 9, 7, 3, 7, 7, 0, 6, 1, 1, 7, 0, 8, 9, 1, 5, 3, 6, 7, 8, 6, 6, 4, 7, 5, 2, 3, 6, 1, 1, 0, 8, 1, 3, 7, 4, 3, 8, 1, 8, 2, 6, 1, 5, 9, 4, 6, 2, 4, 4, 5, 0, 9, 4, 8, 2, 6, 1, 5, 0, 8, 4, 7, 7, 7, 1, 0, 7, 3, 7, 0, 0, 3, 2, 4, 9, 1, 0, 3, 8, 8, 9, 3, 3, 7, 7, 2, 2, 1, 9, 0, 7, 4, 2, 4, 5, 0, 0, 1, 3, 4, 3, 5, 1, 0, 7, 0, 0, 0, 0, 9, 6, 8, 6, 6, 9, 4, 3, 3, 7, 0, 7, 2, 2, 6, 1, 4, 2, 0, 3, 0, 7, 7, 1, 1, 8, 3, 0, 3, 3, 1, 1, 6, 1, 4, 8, 1, 9, 9, 0, 4, 2, 5, 1, 4, 8, 7, 1, 1, 6, 3, 2, 8, 5, 3, 6, 8, 1, 1, 8, 0, 7, 9, 1, 9, 5, 6, 3, 4, 0, 3, 9, 1, 1, 4, 9, 4, 1, 8, 9, 4, 1, 5, 0, 2, 5, 1, 6, 6, 6, 0, 2, 3, 2, 4, 3, 9, 9, 6, 3, 7, 1, 2, 6, 3, 7, 0, 5, 8, 7, 8, 7, 6, 7, 1, 1, 6, 4, 4, 4, 7, 1, 1, 5, 1, 9, 3, 7, 6, 0, 9, 8, 7, 6, 5, 1, 7, 3, 0, 5, 5, 5, 9, 8, 7, 4, 9, 6, 7, 5, 9, 2, 3, 0, 3, 2, 9, 9, 7, 7, 5, 8, 2, 5, 6, 8, 2, 6, 0, 4, 8, 9, 5, 4, 1, 1, 2, 4, 8, 8, 7, 6, 9, 8, 6, 8, 5, 1, 8, 7, 2, 2, 2, 3, 6, 4, 3, 2, 2, 5, 7, 6, 2, 0, 0, 1, 3, 9, 9, 2, 3, 9, 9, 2, 8, 0, 1, 1, 9, 8, 2, 9, 8, 0, 2, 7, 6, 9, 8, 2, 2, 3, 6, 9, 4, 9, 3, 2, 9, 8, 2, 4, 7, 5, 3, 3, 3, 4, 2, 8, 7, 6, 9, 9, 3, 9, 3, 9, 6, 4, 4, 5, 4, 4, 9, 9, 2, 4, 7, 7, 2, 9, 3, 1, 6, 4, 8, 5, 7, 5, 9, 8, 9, 4, 2, 8, 1, 3, 7, 3, 5, 8, 8, 6, 1, 0, 8, 9, 1, 6, 3, 6, 5, 5, 3, 8, 1, 3, 0, 8, 4, 5, 8, 8, 0, 3, 2, 2, 4, 0, 0, 9, 8, 5, 9, 8, 1, 1, 3, 0, 0, 3, 5, 5, 3, 4, 3, 1, 4, 9, 7, 5, 6, 6, 3, 8, 9, 3, 8, 5, 2, 8, 8, 7, 7, 3, 2, 5, 9, 9, 5, 3, 8, 7, 2, 0, 3, 4, 1, 8, 7, 3, 4, 7, 1, 7, 1, 5, 2, 1, 2, 3, 3, 6, 7, 4, 9, 3, 4, 9, 0, 9, 7, 3, 3, 0, 3, 8, 6, 9, 5, 5, 6, 0, 3, 6, 5, 0, 3, 3, 1, 6, 6, 7, 5, 0, 6, 6, 0, 1, 7, 2, 8, 9, 9, 8, 3, 9, 9, 0, 2, 1, 2, 4, 3, 7, 4, 2, 2, 0, 6, 5, 2, 7, 5, 3, 0, 6, 2, 1, 5, 4, 4, 8, 7, 3, 4, 1, 3, 9, 1, 5, 0, 7, 2, 6, 2, 7, 6, 4, 0, 9, 8, 0, 8, 4, 0, 3, 6, 1, 7, 8, 9, 2, 4, 9, 3, 0, 9, 9, 9, 6, 8, 0, 1, 2, 9, 1, 2, 0, 1, 2, 2, 6, 0, 4, 8, 7, 4, 6, 8, 9, 5, 9, 1, 7, 4, 7, 6, 8, 4, 0, 8, 4, 9, 8, 1, 1, 8, 7, 1, 1, 8, 4, 1, 9, 0, 4, 5, 5, 2, 0, 9, 9, 2, 9, 3, 1, 1, 8, 5, 9, 5, 1, 4, 7, 8, 8, 6, 1, 0, 7, 3, 7, 7, 5, 9, 0, 0, 6, 2, 0, 3, 8, 3, 3, 8, 7, 0, 0, 5, 5, 5, 4, 2, 0, 3, 5, 8, 0, 7, 2, 8, 6, 2, 9, 7, 6, 7, 9, 1, 0, 7, 5, 1, 0, 4, 6, 1, 3, 0, 3, 6, 3, 9, 4, 9, 9, 9, 6, 5, 7, 2, 3, 5, 2, 8, 8, 4, 7, 8, 8, 8, 1, 3, 9, 3, 6, 3, 7, 2, 0, 7, 4, 1, 0, 7, 5, 0, 5, 4, 5, 3, 5, 5, 1, 7, 0, 5, 1, 4, 8, 8, 7, 7, 3, 0, 9, 8, 1, 2, 3, 0, 8, 9, 7, 2, 3, 9, 4, 6, 6, 7, 2, 9, 6, 2, 2, 9, 1, 0, 9, 6, 3, 0, 3, 3, 9, 0, 4, 4, 8, 0, 0, 1, 4, 3, 3, 8, 4, 6, 7, 8, 6, 8, 1, 7, 0, 9, 0, 2, 2, 4, 0, 8, 4, 3, 0, 0, 2, 5, 7, 1, 3, 3, 2, 4, 1, 7, 4, 1, 1, 5, 6, 5, 1, 9, 2, 0, 6, 9, 6, 1, 2, 5, 5, 1, 1, 5, 1, 4, 0, 2, 4, 8, 2, 3, 1, 1, 6, 7, 1, 9, 3, 3, 6, 3, 8, 3, 2, 9, 0, 8, 3, 1, 9, 1, 7, 9, 2]
In [71]:
print('Classification Report')
print(classification_report(y_svhn_test,y_svhn_pred_final))
Classification Report
              precision    recall  f1-score   support

           0       0.77      0.81      0.79      1814
           1       0.77      0.80      0.79      1828
           2       0.74      0.78      0.76      1803
           3       0.71      0.72      0.71      1719
           4       0.81      0.80      0.81      1812
           5       0.76      0.70      0.73      1768
           6       0.76      0.76      0.76      1832
           7       0.81      0.82      0.82      1808
           8       0.74      0.72      0.73      1812
           9       0.77      0.73      0.75      1804

    accuracy                           0.76     18000
   macro avg       0.76      0.76      0.76     18000
weighted avg       0.76      0.76      0.76     18000

In [72]:
cm=confusion_matrix(y_svhn_test.tolist(),y_svhn_pred_final)

plt.figure(figsize=(10,7))
sns.heatmap(cm,annot=True,fmt='d', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('Truth')
plt.show()
  • Validation loss and training loss has been decreasing over epochs.
  • Validation accuracy and training accuracy has been increasing over epochs.
  • With different hyperparameter tuning and other mechanism tuning can be used for better metrics and results.
  • To get more data, we can use data augmentation technique which can help images to predict with different axis/rotation and many more.
  • Dropout, weight initialization, regularization and batch normalization and more techniques can be used for improvements.
  • Can use sparse categorical cross entropy which saves memory time.
In [ ]: